Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You may not modify the values in the list's nodes, only nodes itself may be changed.
Example 1:
Given 1->2->3->4, reorder it to 1->4->2->3.
Example 2:
Given 1->2->3->4->5, reorder it to 1->5->2->4->3.
【题意】
按照规则,重新连接一个链表,不可以改变链表里面元素的值。
【思路】
两个指针,一个指向Li,一个指向Ln-i,改变指针的连接即可。但是需要记录Li->next和Ln-i的previous,因为这就是下一次循环的Li和Ln-i。当Li->next==Ln-i时候连接不需要改变,或Li==Ln-i时候,所有元素已经连接完,此时break。
有一个容易忘掉的地方就是修改完所有的结点连接后,需要将尾结点的next指向NULL。(这个我就忘了,结果构造了一个循环数组…
O(n2) T(1)
【代码】
class Solution {
public:
void reorderList(ListNode* head) {
ListNode* p1 = head;
ListNode* p2 = head;
if(head == NULL || head->next==NULL) return ;
while(p2->next != NULL){
p2 = p2->next;
}
while(p1->next!=p2 && p1!=p2){
ListNode* p1Next = p1->next;
ListNode* p2Pre = p1->next;
while(p2Pre->next != p2)
p2Pre = p2Pre->next;
p1->next = p2;
p2->next = p1Next;
p1 = p1Next;
p2 = p2Pre;
}
p2->next = NULL;
}
};