143. Reorder List

来源:互联网 发布:hibernate注解sql 编辑:程序博客网 时间:2024/06/08 18:54
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}.

思路很清晰 找到中点 反转后半部分 然后reorder 
代码稍微比solution复杂点 以下是solution 

public void reorderList(ListNode head) {    if(head==null||head.next==null) return;        //Find the middle of the list    ListNode p1=head;    ListNode p2=head;    while(p2.next!=null&&p2.next.next!=null){         p1=p1.next;        p2=p2.next.next;    }        //Reverse the half after middle  1->2->3->4->5->6 to 1->2->3->6->5->4    ListNode preMiddle=p1;    ListNode preCurrent=p1.next;    while(preCurrent.next!=null){        ListNode current=preCurrent.next;        preCurrent.next=current.next;        current.next=preMiddle.next;        preMiddle.next=current;    }        //Start reorder one by one  1->2->3->6->5->4 to 1->6->2->5->3->4    p1=head;    p2=preMiddle.next;    while(p1!=preMiddle){        preMiddle.next=p2.next;        p2.next=p1.next;        p1.next=p2;        p1=p2.next;        p2=preMiddle.next;    }}