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.
要求in-place完成且一趟遍历完成。
一个很自然的想法是切分成三段。
left middle right
1 2->3->4 5->NULL
单独将中间的reverse,然后再将这3部分连接起来。
要注意的点就是仔细一点,且要考虑left 为空这种情况。
运行时间:
代码:
public ListNode reverseBetween(ListNode head, int m, int n) {
if (m == n) {
return head;
}
ListNode fakeNode = new ListNode(-1);
fakeNode.next = head;
ListNode cur = fakeNode;
int i = 1;
while (i < m) {
cur = cur.next;
i++;
}
ListNode leftLast = cur, middleHead = cur.next;
while (i <= n) {
cur = cur.next;
i++;
}
ListNode rightHead = cur.next;
cur.next = null;
ListNode middleNewHead = reverseListIterative(middleHead);
leftLast.next = middleNewHead;
middleHead.next = rightHead;
return fakeNode.next;
}
public ListNode reverseListIterative(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode fakeNode = new ListNode(-1);
fakeNode.next = head;
ListNode cur = head.next, pre= head;
while (cur != null) {
pre.next = pre.next.next;
cur.next = fakeNode.next;
fakeNode.next = cur;
cur = pre.next;
}
return fakeNode.next;
}