Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You must do this in-place without altering the nodes' values.
For example,
Given {1,2,3,4}
, reorder it to {1,4,2,3}
.
首先分析一下它的重排规则。
它是把在最后面的部分倒着排上来了。
解法分为2步:
1. 找到链表的中间部分,翻转中间部分。(1,2,3,4,5的话,是4,5翻转;1,2,3,4的话,是4翻转)
这用快慢指针实现。
2. 将新翻转的节点一个一个插入原链表的前面部分。
运行时间:
代码:
public void reorderList(ListNode head) {
if (head == null || head.next == null || head.next.next == null) {
return;
}
ListNode fast = head, slow = head;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
}
ListNode reverseHead = reverseListIterative(slow.next);
slow.next = null;
ListNode cur = head, temp = null;
while (reverseHead != null) {
temp = reverseHead.next;
reverseHead.next = cur.next;
cur.next = reverseHead;
cur = reverseHead.next;
reverseHead = temp;
}
}
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;
}