Reorder List

Given a singly linked list LL0L1→…→Ln-1Ln,
reorder it to: L0LnL1Ln-1L2Ln-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}.

Code:

class Solution {
public:
    void reorderList(ListNode *head) {
        if(head==NULL) return;
        ListNode *p1=head;
        ListNode *p2=head;
        int num;
        for(num=1;p2->next;num++) // point to the last node
            p2=p2->next;
        if(num>2){
            for(int i=1;2*i<num;i++) //find the middle node
                p1=p1->next;
            ListNode *pre=p1;
            ListNode *cur=p1->next;
            ListNode *nex=NULL;
            while(cur){ // reverse those arrows after the middle node
                nex=cur->next;
                cur->next=pre;
                pre=cur;
                cur=nex;
            }
            p1=head; // reorder the nodes
            while(p1!=p2){
                ListNode *p1Nex=p1->next;
                ListNode *p2Nex=p2->next;
                p1->next=p2;
                if(p2->next!=p1){
                    p2->next=p1Nex;
                    p1=p1Nex;
                    p2=p2Nex;
                }else
                    break;
            }
            p2->next=NULL;
        }
        return;
    }
};
原文地址:https://www.cnblogs.com/winscoder/p/3408976.html