reorder-list

Given a singly linked list L: L 0→L 1→…→L n-1→L n,
reorder it to: L 0→L n →L 1→L n-1→L 2→L n-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}.



/**
 * 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) {
        if (null == head || null == head.next) {
            return;
        }
        ListNode slowPtr = head;
        ListNode fastPtr = head;
        while (null != fastPtr.next && null != fastPtr.next.next) {
            slowPtr = slowPtr.next;
            fastPtr = fastPtr.next.next;
        }

        ListNode startPtr = slowPtr.next;
        ListNode headPtr = startPtr;
        slowPtr.next = null;
        while (null != headPtr.next) {
            ListNode tempPtr = headPtr.next;
            headPtr.next = tempPtr.next;
            tempPtr.next = startPtr;
            startPtr = tempPtr;
        }

        ListNode l1 = head;
        ListNode l2 = startPtr;
        while (null != l1 && null != l2) {
            ListNode tempPtr = l2;
            l2 = l2.next;
            tempPtr.next = l1.next;
            l1.next = tempPtr;
            l1 = l1.next.next;
        }
    }
}