• [leetCode]剑指 Offer 35. 复杂链表的复制


    在这里插入图片描述

    解法

    • 第一步:复制链表的所有节点,并放在对应节点之后形成一个长链表。这样的好处是在没有使用额外空间的情况下,在O(1)时间内找到random指针指向的节点
    • 第二步: 复制所有random指针
    • 第三步:将长链表的偶数部分与奇数部分拆分,返回偶数部分

    1
    在这里插入图片描述
    在这里插入图片描述
    2
    在这里插入图片描述
    3
    在这里插入图片描述

    /*
    // Definition for a Node.
    class Node {
        int val;
        Node next;
        Node random;
    
        public Node(int val) {
            this.val = val;
            this.next = null;
            this.random = null;
        }
    }
    */
    class Solution {
        public Node copyRandomList(Node head) {
            cloneNodes(head);
            connectRandomNodes(head);
            return reconnectNodes(head);
        }
        //第一步:复制链表的所有节点N的副本N',将N'放在N的后面串成一串
        private void cloneNodes(Node head){
            Node pNode = head;
            while(pNode != null){
                Node node = new Node(pNode.val);
                node.next = pNode.next;
                pNode.next = node;
                pNode = node.next;
            }
        }
        //第二步:复制random指针,原链表上N的random指针指向S,则复制链表上的N’指向S’
        private void connectRandomNodes(Node head){
            Node pNode = head;
            while(pNode != null){
                Node pCloned = pNode.next;
                if(pNode.random != null){
                    pCloned.random = pNode.random.next; 
                }
                pNode = pCloned.next;
            }
        }
        //第三步:将长链表拆成两个链表,奇数位置用next指针连接起来就是原链表,偶数位置连接起来就是复制链表
        private Node reconnectNodes(Node head){
            Node pNode = head;
            Node pCloneHead = null;
            Node pCloneNode = null;
            if(pNode != null){
                pCloneHead = pCloneNode = pNode.next;
                pNode.next = pCloneNode.next;
                pNode = pNode.next;
            }
            while(pNode != null){
                pCloneNode.next = pNode.next;
                pCloneNode = pCloneNode.next;
                pNode.next = pCloneNode.next;
                pNode = pNode.next;
            }
            return pCloneHead;
        }
    }
    
  • 相关阅读:
    哈哈哈!网站本地更新功能全部实现拉!!!发贴庆祝!
    用最愚蠢的方法实现了CVC 数据同步功能...
    我的一个异步操作UML
    11月10日
    The 7 Most Useful Data Analysis Methods and Techniques
    统计学中的各种检验scipy.stats和statsmodels.stats的使用
    TimscaleDB 2.0发布,现在是分布式多节点
    Console Win32 API Native Methods Helper
    SocketAsyncEventArgs Socket Echo Server
    bytes array handling compare
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/13859955.html
Copyright © 2020-2023  润新知