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. 把前半部分链表及后半部分链表合并
4. 把中间节点 指向 null
/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public void reorderList(ListNode head) { int count = 0; ListNode midPoint = head; ListNode fastRunner = head;
// while 结束时 fastRunner指向的是最后一个点 mid指向的是中点,如果总数是偶数,指向的是晓得值 while(fastRunner != null && fastRunner.next != null){ fastRunner = fastRunner.next.next; midPoint = midPoint.next; count++; } if(count < 1 || midPoint.next == null) return; fastRunner = midPoint.next; ListNode runner = midPoint; while(fastRunner != null){ ListNode tmp = fastRunner.next; fastRunner.next = runner; runner = fastRunner; fastRunner = tmp; } ListNode frontRunner = head; ListNode backRunner = runner; while(frontRunner != midPoint && backRunner != midPoint){ ListNode tmp = backRunner.next; backRunner.next = frontRunner.next; frontRunner.next = backRunner; backRunner = tmp; frontRunner = frontRunner.next.next; } midPoint.next = null; } }