• leetcode 143. Reorder List ----- java


    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 ;
        }
    }
  • 相关阅读:
    蛇形填数
    开灯问题
    水仙花数
    C++Primer笔记-----day02
    C++Primer笔记-----day01
    面试智力题
    maven 打包197
    子系统 安装vsftpd197
    office 安装破解197
    oracle 创建多个数据库197
  • 原文地址:https://www.cnblogs.com/xiaoba1203/p/6068310.html
Copyright © 2020-2023  润新知