Leetcode: Reorder List
2015-06-18 22:22
429 查看
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}.
解析:
把问题分解成小问题再分步解决:1. 找出中点分割链表;2. 翻转第二个链表; 3. 两个链表依次重新合并
代码:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ public class Solution { public void reorderList(ListNode head) { if(head==null||head.next==null||head.next.next==null)return; ListNode dummy = new ListNode(0); dummy.next = head; ListNode fast = dummy; ListNode slow = dummy; while(fast!=null&&fast.next!=null) {slow = slow.next;fast = fast.next.next;} ListNode curr = slow.next; ListNode next = curr.next; slow.next = null; curr.next = null; while(next!=null) { ListNode tmp = next.next; next.next = curr; curr = next; next = tmp; } ListNode rehead = curr; ListNode n1 = head; ListNode n2 = rehead; int t = 1; while(n1!=null||n2!=null) { if(t==1) {ListNode tmp = n1.next;n1.next = n2;n1 = tmp;t=2;} else {ListNode tmp = n2.next;n2.next = n1;n2 = tmp;t=1;} } return; } }
相关文章推荐
- [C/C++]反转链表
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- Linux内核链表实现过程
- C++链表倒序实现方法
- C#通过链表实现队列的方法
- 找出链表倒数第n个节点元素的二个方法
- Java数据结构之简单链表的定义与实现方法示例
- C语言单循环链表的表示与实现实例详解
- C++实现的链表类实例
- PHP小教程之实现链表
- C语言双向链表的表示与实现实例详解
- C语言实现输出链表中倒数第k个节点
- C++语言实现线性表之链表实例
- STL list链表的用法详细解析
- C语言创建链表错误之通过指针参数申请动态内存实例分析
- 编码实现从无序链表中移除重复项(C和JAVA实例)
- Java采用循环链表结构求解约瑟夫问题
- Python实现的数据结构与算法之链表详解
- leetcode 179 Largest Number
- leetcode 24 Swap Nodes in Pairs