Given a singly linked list
L:
L
0→
L
1→…→
L
n-1→
L
n,
reorder it to: L 0→ L n→ L 1→ L n-1→ L 2→ L n-2→…
reorder it to: L 0→ L n→ L 1→ L n-1→ L 2→ L n-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;
}
}
}
}