您的位置:首页 > 其它

Reorder List

2016-05-23 20:38 267 查看
题目描述:

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}.

比如1,2,3,4,5,6,7,要得到的结果是1,7,2,6,3,5,4.

1、先把数组分成两个部分:1,2,3,4和5,6,7

2、将5,6,7逆序得到7,6,5

3、然后将7,6,5插入到1,2,3,4中

逆序,插入,查找链表中第k个数,这些都是很熟悉的操作,代码如下:

public void reorderList(ListNode head) {
int sum=0;
ListNode p=head;
//得到链表的长度
while(p!=null){
p=p.next;
sum++;
}
if(sum<=2)
return;
int n=(sum+1)/2;
/*将链表分成两个链表。第一个链表head开头,n个,第二个链表head2开头,sum-n个,注意这里的第一个链表最后一个节点的next要赋值为null*/
p=head;
while(n>1){
p=p.next;
n--;
}
ListNode head2=p.next;
p.next=null;
//tail找到整个链表的最后一个节点
ListNode tail=head2;
while(tail.next!=null){
tail=tail.next;
}
//将第二个数组逆序
p=tail;
while(head2!=tail){
ListNode next=head2.next;
head2.next=tail.next;
tail.next=head2;
head2=next;
}
head2=tail;
p=head;
//将第二个数组插入到第一个数组中
while(head2!=null){
ListNode next=head2.next;
ListNode pnext=p.next;
head2.next=p.next;
p.next=head2;
head2=next;
p=pnext;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: