题目链接:https://leetcode.com/problems/reverse-linked-list-ii/
题目:
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.
思路:
思路简单,直接做就好了。主要要注意如果加头结点可以简化算法。
算法:
public ListNode reverseBetween(ListNode head, int m, int n) {
if (head == null)
return null;
ListNode newHead = new ListNode(0);
newHead.next = head;
// start/head~rear/end,反转head到rear之间的结点,start/end是反转区间两个结点
ListNode rear = head, start = newHead, end = head.next;
m = m - 1;
while (m-- > 0)//因为start是从头结点开始算,所以要多走一步,即m--,而不是像下面的--n
start = start.next;
head = start.next;
while (--n > 0)
rear = rear.next;
end = rear.next;
// ===反转 head到rear之间结点
ListNode p = head, q, t;
q = p.next;
while (p != rear) {
t = q.next;
q.next = p;
p = q;
q = t;
}
// ===
start.next = rear;
head.next = end;
return newHead.next;
}