题目描述
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}
.
解题思路
为了达到上述目标,我们采取以下策略:
- 获取列表长度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;
}