Reorder List

Given a singly linked list LL0L1→…→Ln-1Ln,
reorder it to: L0LnL1Ln-1L2Ln-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; } }

 

posted @ 2014-02-19 09:01  Razer.Lu  阅读(138)  评论(0编辑  收藏  举报