1。题目
给定一个单链表L: L0→L1→…→Ln-1→Ln,
重新排列后为:L0→Ln→L1→Ln-1→L2→Ln-2→…
必须在不改变节点值的情况下进行原地操作。
1->2->3->4->null
,重新排列后为
1->4->2->3->null
。
2.算法
这个题目是链表操作的题目,分三步完成
1.找到链表的中间并把链表分为两半
2.逆序得到的第二个链表,
3.把两链表和在一起
public void reorderList(ListNode head) {
if(head == null || head.next==null)
{
return;
}
ListNode walker = head;
ListNode runner = head;
//找中点
while(runner.next!=null && runner.next.next!=null)
{
runner = runner.next.next;
walker = walker.next;
}
ListNode head2 = walker.next;
ListNode head1 = head;
walker.next = null;
//反转第二个
head2 = reverse(head2);
//合并
while(head1!=null && head2!=null)
{
ListNode next = head2.next;
head2.next = head1.next;
head1.next = head2;
head1 = head2.next;
head2 = next;
}
}
private ListNode reverse(ListNode head)
{
ListNode pre = null;
ListNode cur = head;
while(cur!=null)
{
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}