LeetCode 143. Reorder List

来源:互联网 发布:网络最红歌曲排行榜 编辑:程序博客网 时间:2024/06/04 18:21
Given a singly linked list L: L0L1→…→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}.


解题思路:计算链表总结点数,然后将后一半节点与前一半节点断开,并将后一半链表原地翻转,然后依次扫描前半链表与后半链表,将后半链表的节点插入到合适的地方。
public class Solution {    public void reorderList(ListNode head) {        if(head!=null && head.next!=null && head.next.next!=null){  //这三种情况下,链表不用调整                    int count=0;            ListNode p=head;            while(p!=null){     //计算出链表的总节点个数                count++;                p=p.next;            }            p=head;            int i=1;            while(i<=count/2){      //当节点总数为奇数时,等号保证了中间节点分到了前半链表                i++;                p=p.next;            }            //while循环结束后p指向前半链表的最后一个节点            ListNode headb=p.next;      //headb始终指向后半节点的头节点            p.next=null;                        ListNode q=headb;           //定义节点q,q向后移动,这里先定义,随便赋值为headb            if(headb.next!=null){                 q=headb.next;                 headb.next=null;        //一定要截断headb与后面节点的联系                 while(q!=null){                    ListNode  r=q;                    q=q.next;                    r.next=headb;                    headb=r;                 }            }            p=head;q=headb;            while(p!=null && q!=null){               ListNode pa=p.next;          //记录后面的指针,不能将p、q直接赋值给新节点               ListNode qa=q.next;               q.next=null;     //先截断原链表               q.next=p.next;               p.next=q;               p=pa;               q=qa;                            }                    }    }}

0 0
原创粉丝点击