[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; }
相关文章推荐
- 【LEETCODE】143- Reorder List [Python]
- [LeetCode] Reorder List
- leetCode No.143 Reorder List
- leetcode--Reorder List
- LeetCode reorder-list
- LeetCode--Reorder List
- leetcode-m-Reorder List
- Leetcode ReorderList
- LeetCode 143 Reorder List
- [LeetCode] Reorder List
- leetcode 之Reorder List(25)
- LeetCode | Reorder List(链表重新排序)
- LeetCode(143) Reorder List
- Reorder List @LeetCode
- leetcode-Reorder List-143
- [leetcode]Reorder List
- leetcode 刷题之路 17 Reorder List
- leetcode Reorder List
- Leetcode Reorder List
- [LeetCode] Reorder List