题目描述:
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;
}
}
链表重排序算法
4690

被折叠的 条评论
为什么被折叠?



