您的位置:首页 > 其它

[LeetCode]Reorder List

2014-03-06 17:14 288 查看

题目描述

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}
.
对已有列表进行重排,使之按照L0→Ln→L1→Ln-1→L2→Ln-2→…的顺序排列。

解题思路

为了达到上述目标,我们采取以下策略:



获取列表长度len,计算得到尾部需要插入头部链表的长度为len/2;
得到头部链表的末尾节点,通过此节点获取尾部链表的头节点halfHead;
反转尾部链表节点,即以第2步获取的halfHead节点为头节点的链表;
将反转后的链表按序插入到头部链表的相邻节点中间;
结束,得到了重排后的链表。

代码

public  void reorderList(ListNode head) {
ListNode node = head,halfHead = head,tempNode1,tempNode2;
int len = 0, halfLen;
if (node == null || node.next == null || node.next.next == null) {
return;
}

while (node != null) {
node = node.next;
len++;
}

halfLen = len / 2;//得到需要重排节点的个数

node = head;
for (int i = 0;i < len - halfLen - 1; node = node.next, i++) {
}
halfHead = node.next;//得到尾部需插入头部节点的链表头
node.next = null;

node = head;
ListNode reversehalfHead = reverseList(halfHead);//逆转链表

//插入链表前部
for(int i = 0;i < halfLen;i++){
tempNode1 = node.next;
tempNode2 = reversehalfHead.next;
node.next = reversehalfHead;
reversehalfHead.next = tempNode1;
reversehalfHead = tempNode2;
node = tempNode1;
}
}


逆转链表的子函数:
public  ListNode reverseList(ListNode head) {
ListNode node = head,lastNode = head,tempNode;
if(node==null || node.next==null)
return node;
node = node.next;
lastNode.next = null;
while(node!=null){
tempNode = node.next;
node.next = lastNode;
lastNode = node;
node = tempNode;
}
return lastNode;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: