力扣138【随机链表的复制】

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。

构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和random

指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。

例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有x.random --> y 。

返回复制链表的头节点。

这题比较难的是理解题意:中文翻译过来比较难理解,实际上就是深拷贝一个链表,(这个链表多一个random属性,它指向链表某个节点),深拷贝的这个链表也必须有这种结构关系!

解决方法:关键就是解决深拷贝代码的random指针,根据原链表的位置去找新链表的相对位置,这里要么用map记录索引位置去找;要么就用更好的思路,将新链表的每一个节点先穿在原链表后面!

java 复制代码
class Solution {
    public Node copyRandomList(Node head) {
        if (head == null) {
            return null;
        }
        //这里将节点的拷贝节点直接插入其后真是神来之笔
        for (Node node = head; node != null; node = node.next.next) {
            Node nodeNew = new Node(node.val);
            nodeNew.next = node.next;
            node.next = nodeNew;
        }
        //只需要找原链表的random节点,后面跟的一定是此节点的random节点
        for (Node node = head; node != null; node = node.next.next) {
            Node nodeNew = node.next;
            //注意可能有null
            nodeNew.random = (node.random != null) ? node.random.next : null;
        }

		//最后就是遍历摘下来新链表
        Node headNew = head.next;
        for (Node node = head; node != null; node = node.next) {
            Node nodeNew = node.next;
            node.next = node.next.next;
            nodeNew.next = (nodeNew.next != null) ? nodeNew.next.next : null;
        }

        return headNew;
    }
}
相关推荐
仰泳的熊猫1 小时前
1077 Kuchiguse
数据结构·c++·算法·pat考试
LYFlied2 小时前
【每日算法】LeetCode 19. 删除链表的倒数第 N 个结点
算法·leetcode·链表
踏浪无痕2 小时前
计算机算钱为什么会算错?怎么解决?
后端·算法·面试
消失的旧时光-19432 小时前
从 C 链表到 Android Looper:MessageQueue 的底层原理一条线讲透
android·数据结构·链表
夏乌_Wx2 小时前
练题100天——DAY28:找消失的数字+分发饼干
数据结构·算法
lzh200409192 小时前
二叉搜索树与双向链表
数据结构·链表
studytosky2 小时前
深度学习理论与实战:反向传播、参数初始化与优化算法全解析
人工智能·python·深度学习·算法·分类·matplotlib
WolfGang0073212 小时前
代码随想录算法训练营Day48 | 108.冗余连接、109.冗余连接II
数据结构·c++·算法
努力学算法的蒟蒻3 小时前
day35(12.16)——leetcode面试经典150
算法·leetcode·面试
cccc来财3 小时前
角点检测算法:Harris 和 FAST 方法
算法·计算机视觉·特征提取