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)return;
stack<ListNode *> st;
ListNode *p=head,*q=head;
while(q!=NULL&&q->next!=NULL){
p=p->next;
q=q->next->next;
}
q=p->next;
p->next=NULL;
while(q!=NULL){
st.push(q);
q=q->next;
}
p=head;
ListNode *t;
while(p!=NULL){
t=p;
p=p->next;
if(!st.empty()){
t->next=st.top();
st.top()->next=p;
st.pop();
}
}
}
};