Given a singly linked list LL0→L1→…→Ln-1→Ln,
reorder it to: L0→LnL1→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、使用list记录链表。

/**
 * 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) {
        
        List<ListNode> list = new ArrayList<ListNode>();
        ListNode node = head;
        while( node != null ){
            list.add(node);
            node = node.next;
        }
        int len = list.size();
        if( len < 3)
            return ;

        node = head;
        node.next = list.get(len-1);
        node = node.next;
        for( int i = 1;i<len/2;i++){

            node.next = list.get(i);
            node.next.next = list.get(len-1-i);
            node = node.next.next;
        }
        if( len%2 != 0){
            node.next = list.get(len/2);
            node = node.next;
        }
        node.next = null;

        return ;
    }
}

 

2、使用双向队列。

 

/**
 * 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) {
        
        Deque<ListNode> deque = new ArrayDeque<ListNode>();

        ListNode node = head;

        while( node != null ){
            deque.add( node );
            node = node.next;
        }
        if( deque.size() < 3)
            return ;
        node = deque.poll();
        node.next = deque.pollLast();
        node = node.next;
        while( !deque.isEmpty() ){
            node.next = deque.poll();
            node.next.next = deque.pollLast();
            node = node.next.next;
        }
        if( node != null )
            node.next = null;
        return ;
    }
}

 

 

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 slow = head;
        ListNode fast = head.next;
        while( fast!= null && fast.next != null){
            fast = fast.next.next;
            slow = slow.next;
        }
        
        ListNode node2 = slow;
        fast = slow.next;
        
        while( fast != null ){
            

            ListNode node = fast.next;
            fast.next = slow;
            slow = fast;
            fast = node;
            

        }
        node2.next = null;
        node2 = slow;
        ListNode node1 = head;
        
        while( node1 != null   ){
            ListNode node = node1.next;
            ListNode nn = node2.next;
            node1.next = node2;
            node2.next = node;
            node1 = node;
            node2 = nn;
        }
        
        

        return ;
    }
}