zoukankan      html  css  js  c++  java
  • 算法——复杂链表的复制(插入中点法)

    请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
    链接:leetcode

    解题思路:不同于简单列表的复制,这个多了一个随机指针。如果是简单列表,直接构造一个新的列表,将老链表遍历复制数据就好了。但是,随机指针就不能这么做了,因为随机指针指向的可能是还没有遍历的到节点,那就没法指了。

    所以,一种思路是这样的。三次遍历,第一次遍历,复制一个新的节点到每两个旧节点中间。第二次遍历,将新节点的随机指针指向被复制的旧节点的随机指针的下一个节点(看代码就懂了)。第三次遍历,将新旧节点分开,得到两个新旧链表。

    需要注意的问题,在第二次遍历的时候,复制随机节点可能是null的,如果是null,那就直接将随机指针置为null就好了。

    在第三次遍历的时候,需要预判是不是到了尾节点,这样就能把新链表的尾节点的next指向null。

    /*
    // 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) {
            if(head == null) return head;
    
            Node cur = head;
    
            while(cur != null) {
                Node temp = cur.next;
                cur.next = new Node(cur.val);
                cur.next.next = temp;
                cur = temp;
            }
    
            cur = head;
            while(cur != null) {
                cur.next.random = cur.random == null ? null : cur.random.next;
                cur = cur.next.next;
            }
    
            cur = head;
            Node res = cur.next;
            while(cur != null) {
                Node temp = cur.next;
                cur.next = temp.next;
                temp.next = cur.next == null ? null : cur.next.next;
                cur = cur.next;
            }
    
            return res;
    
        }
    }
    
  • 相关阅读:
    上网助手(集成ipv6)windows版
    c# 串口编程
    test blog
    用于主题检测的临时日志(d020b283408c4bc68872f97ee237b663 3bfe001a32de4114a6b44005b770f6d7)
    OpenGL概述 陌陌
    [转载][转帖]谈谈我对攻读计算机研究生的看法。。。大牛的文章,见解精深独到
    滚动值的兼容问题
    js小练习去掉指定的字符组成一句话输出
    马虎将classname加到了id属性中,造成报错
    锋利的jquery读书笔记(一)
  • 原文地址:https://www.cnblogs.com/lippon/p/14117671.html
Copyright © 2011-2022 走看看