您的位置:首页 > 编程语言 > Java开发

[Leetcode][JAVA] Reorder List

2014-10-07 23:04 363 查看
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}
.


比较容易思考且实现的一个思路是, 将链表从中心拆成两半,后一半全部反向连接,然后前一半和后一半一个一个节点交替连接。

拆分阶段使用快慢指针方法即可得到两个平分的链表。

反向和合并阶段就是很常规的链表操作。

代码:

public void reorderList(ListNode head) {
if(head==null || head.next==null)
return;
//split
ListNode fast = head;
ListNode slow = head;
while(true)
{
fast = fast.next.next;
if(fast==null || fast.next==null)
break;
slow = slow.next;
}
fast = slow.next;
slow.next = null;
slow = head;
//reverse fast
fast = reverse(fast);
//insert
while(slow!=null && fast!=null)
{
ListNode snext=slow.next;
ListNode fnext=fast.next;
slow.next=fast;
if(snext!=null)
fast.next=snext;
slow = snext;
fast = fnext;
}
}
public ListNode reverse(ListNode head)
{
ListNode cur = head;
ListNode pre = null;
while(cur!=null)
{
ListNode temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: