Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:
Given 1->2->3->4->5->NULL
, m = 2 and n =
4,
return 1->4->3->2->5->NULL
.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
反转单链表的精髓就是,每次把最后一个Node提到首部的后方,就是把最后一个Node提到最前面。
注意一定要设置一个“哨兵头结点”,以保证第一个结点也能被反转。
ListNode dummy = new ListNode(0);
dummy.next = head;
head = dummy;
题目AC的代码如下:
public class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
if (m >= n || head == null) {
return head;
}
ListNode dummy = new ListNode(0);
dummy.next = head;
head = dummy;
for (int i = 1; i < m; i++) {
if (head == null) {
return null;
}
head = head.next;
}
ListNode one = head;
ListNode two = head.next;
ListNode three = two.next;
ListNode temp = three.next;
for(int j = m; j < n ; j++){
temp = three.next;
three.next = one.next;
one.next = three;
two.next = temp;
three = two.next;
}
return dummy.next;
}
}