首页 > 代码库 > leetcode 143. Reorder List ----- java
leetcode 143. Reorder List ----- java
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 ; } }
leetcode 143. Reorder List ----- java
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。