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}
.
中间切一刀,前半部分记为L1,然后把后半部分反转记为L2,修改指向,轮流指向L1一个,指向L2一个
public class Solution {
public void reorderList(ListNode head)
{
ListNode node=head;
int cnt=0;
while(node!=null)
{
cnt++;
node=node.next;
}
ListNode rhead=null;
node=head;
for(int i=0;i<(cnt%2==0?cnt/2:cnt/2+1);i++)
node=node.next;
rhead=node;
rhead=reverse(rhead);
ListNode lhead=head;
while(lhead!=null&&rhead!=null)
{
ListNode lnext=lhead.next;
ListNode rnext=rhead.next;
lhead.next=rhead;
lhead=lnext;
rhead.next=lhead;
rhead=rnext;
}
if(lhead!=null)
lhead.next=null;
}
private ListNode reverse(ListNode head)
{
if(head==null)
return head;
ListNode prev=head;
ListNode p=head.next;
ListNode pnext=null;
while(p!=null)
{
pnext=p.next;
p.next=prev;
prev=p;
p=pnext;
}
head.next=null;
return prev;
}
}