首页 > 其他分享 >随机链表的复制(哈希表)

随机链表的复制(哈希表)

时间:2024-12-22 13:52:46浏览次数:3  
标签:node Node head random 链表 随机 哈希 节点

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

构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。

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

返回复制链表的头节点。

用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:

  • val:一个表示 Node.val 的整数。
  • random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为  null 。

你的代码 只 接受原链表的头节点 head 作为传入参数。

 

示例 1:

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

示例 2:

输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]

示例 3:

输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]

 

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;
    
    Node(int _val) {
        val = _val;
        next = NULL;
        random = NULL;
    }
};
*/

class Solution {
public:
    Node* copyRandomList(Node* head) {
        if(head==NULL) return head;
        //通过map存储新旧节点的映射关系
        map<Node*,Node*> mp;
        Node* node = head;
        //初始化mp
        while(node){
            Node *clone = new Node(node->val,NULL,NULL);
            mp[node] = clone;
            node = node->next;
        }
        node = head;
        while(node){
            mp[node]->next = mp[node->next];
            mp[node]->random = mp[node->random];
            node = node->next;
        }
        return mp[head];
    }
};

 

标签:node,Node,head,random,链表,随机,哈希,节点
From: https://www.cnblogs.com/yueshengd/p/18622051

相关文章

  • K 个一组翻转链表(逆置链表+递归)
    给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。 示例1:输入:head......
  • 两两交换链表中的节点(迭代)
    给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即只能进行节点交换)。 示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]示例2:输入:head=[]输出:[]示例3:输入:head=[1]输出:[1] /***Definitionforsing......
  • 【期末复习?】有关滑动窗口算法与哈希表的笔记
    文章目录前言一、滑动窗口二、哈希表前言即将期末考试,感觉自己水平明显下滑(虽然本来就没什么水平),先看点东西提升一下。同时预告一下:据读者反映,原博客“2024XDOJ及答案”打开会卡住。个人推测是文字量太大(毕竟已经将近十万字了,笑哭),加载困难的原因,因此这里提前说明。......
  • 代码随想录算法训练营第五天-哈希-242.有效的字母异位词
    这道题的总体感觉不是很难,但是其完成的思想还是很有趣的利用数据下标来代表字母序列然后遍历两个字符串每个字符,给对应字母下标的数组中一个自增,另一个自减通过查看最后的数组内容是不是0,来判断是不是异位词#include<iostream>#include<array>classSolution{public......
  • 【Web】0基础学Web—随机颜色、数学对象、日期及方法、定时器、倒计时
    0基础学Web—随机颜色、数学对象、日期及方法、定时器、倒计时随机颜色数学对象日期及方法定时器倒计时cssjs随机颜色点击div时,随机改变div背景颜色<body><divclass="wrapper"onclick="changebgColor()"></div><script>//改变背景颜色......
  • TIA环境下SCL编程练习:产生m到n之间的随机整数,存入数组
    假设需要读取100个随机数,存入有100个成员的数组。做这个练习是为了学习一下SCL编程。随机数使用系统时钟纳秒数来线性转换。新建项目,选用1500PLC(6ES7513-1AL02-0AB0,当然可以选用其它型号),设定本地时区,建立网络。新建DB,建立变量,取消优化块的访问。 新建FC,先建立内部变量如下......
  • 机器学习实验八:随机森林算法实现与测试
    实验八:随机森林算法实现与测试一、实验目的深入理解随机森林的算法原理,进而理解集成学习的意义,能够使用Python语言实现随机森林算法的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。 二、实验内容(1)从scikit-learn库中加载iris数据集,使用留出法留出1/3的......
  • 合并两个有序链表(迭代)
    将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。  示例1:输入:l1=[1,2,4],l2=[1,3,4]输出:[1,1,2,3,4,4]示例2:输入:l1=[],l2=[]输出:[]示例3:输入:l1=[],l2=[0]输出:[0]思路:首先,我们设定一个哨兵节......
  • 初阶3 链表
    本章重点链表链表OJ题链表与顺序表区别1.链表1.1链表的概念及结构概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。结构:注意:从上图可看出,链式结构在逻辑上是连续的,但是在物理上不一定连续现实中的结......
  • 环形链表 II(快慢指针)
    给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从0开始)。如果......