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、使用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 ; } }