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||head->next->next==NULL)return; ListNode * slow=head; ListNode * fast=head; ListNode * pres=NULL; while(fast&&fast->next) { fast=fast->next->next; pres=slow; slow=slow->next; } pres->next=NULL; ListNode *tmp=new ListNode(0); tmp->next=slow; ListNode *last=slow; slow=slow->next; ListNode *p=NULL; while(slow&&slow->next) { p=tmp->next; tmp->next=slow; ListNode *later=slow->next; slow->next=p; slow=later; } if(slow) { p=tmp->next; tmp->next=slow; slow->next=p; } last->next=NULL; slow=tmp->next; fast=head; ListNode *f=NULL; while(fast&&slow) { p=slow->next; f=fast->next; fast->next=slow; if(f==NULL) { slow->next=p; break; } slow->next=f; fast=f; slow=p; } } /** void reorderList(ListNode *head) { if(head==NULL)return; vector<ListNode *> tmp; ListNode *p=head; while(p) { tmp.push_back(p); p=p->next; } int left=0,right=tmp.size()-1; while(left<right) { tmp[left]->next=tmp[right]; left++; tmp[right]->next=tmp[left]; right--; tmp[left]->next=tmp[right]; } tmp[left]->next=NULL; } */ };