题目:
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}
.
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void reorderList(ListNode *head) {
if(head == NULL || head->next == NULL)
return;
ListNode *slow = head, *fast = head, *pre = head;
将列表从中间断开,形成两个链表head和slow
while(fast != NULL && fast->next != NULL) {
fast = fast->next->next;
pre = slow;
slow = slow->next;
}
pre->next = NULL;
slow = reverseList(slow);
mergeList(head, slow);
}
private:
//将后部分链表反序
ListNode *reverseList(ListNode *head) {
ListNode *cur = head;
ListNode *pre = NULL;
ListNode *post = cur->next;
while(cur != NULL) {
//记下下一个指针
post = cur->next;
cur->next = pre;
pre = cur;
cur = post;
}
return pre;
}
void mergeList(ListNode *head, ListNode *slow) {
ListNode *tmp = head;
ListNode *pre_tmp = head;
ListNode *post_slow = slow->next;
while(tmp != NULL) {
post_slow = slow->next;
slow->next = tmp->next;
tmp->next = slow;
pre_tmp = tmp->next;
tmp = tmp->next->next;
slow = post_slow;
}
if(slow != NULL)
pre_tmp->next = slow;
}
};