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}.
基本思路:
1. 找到链表的中间分割结点;
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 || !head->next){
return ;
}
ListNode * partition_node = get_partition_node(head);
ListNode * left = head;
ListNode * right = reverse_list(partition_node);
head = merge_list(left, right);
}
ListNode * get_partition_node(ListNode * head){
ListNode * pre = head;
ListNode * slow = head;
ListNode * fast = head;
while(fast && fast->next){
fast = fast->next->next;
pre = slow;
slow = slow->next;
}
pre->next = NULL;
return slow;
}
ListNode * reverse_list(ListNode * head){
ListNode dummy(0);
dummy.next = head;
ListNode * prev = &dummy;
ListNode * cur = prev->next;
while(cur->next){
ListNode * succ = cur->next;
cur->next = succ->next;
succ->next = prev->next;
prev->next = succ;
}
return dummy.next;
}
ListNode * merge_list(ListNode * left, ListNode * right){
ListNode dummy(0);
dummy.next = left;
while(left->next && right->next){
ListNode * lTemp = left->next;
left->next = right;
ListNode * rTemp = right->next;
right->next = lTemp;
left = lTemp;
right = rTemp;
}
if(right){
left->next = right;
}
return dummy.next;
}
};