您的位置:首页 > 其它

LeetCode 143. Reorder List

2017-04-27 00:05 288 查看
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}
.

解题思路:计算链表总结点数,然后将后一半节点与前一半节点断开,并将后一半链表原地翻转,然后依次扫描前半链表与后半链表,将后半链表的节点插入到合适的地方。
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;

}

}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: