力扣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 小时前
C语言_数据结构总结8:链式队列
c语言·开发语言·数据结构·链表·visualstudio·visual studio
真就死难3 小时前
完全日期(日期枚举问题)--- 数学性质题型
算法·日期枚举
不知道取啥耶3 小时前
C++ 滑动窗口
数据结构·c++·算法·leetcode
花间流风3 小时前
晏殊几何学讲义
算法·矩阵·几何学·情感分析
@心都3 小时前
机器学习数学基础:42.AMOS 结构方程模型(SEM)分析的系统流程
人工智能·算法·机器学习
tt5555555555554 小时前
每日一题——三道链表简单题:回文,环形合并有序
数据结构·链表
我想吃烤肉肉4 小时前
leetcode-sql数据库面试题冲刺(高频SQL五十题)
数据库·sql·leetcode
小六子成长记5 小时前
C语言数据结构之顺序表
数据结构·链表
北顾南栀倾寒6 小时前
[算法笔记]cin和getline的并用、如何区分两个数据对、C++中std::tuple类
笔记·算法
一只大侠7 小时前
牛客周赛A:84:JAVA
算法