随机链表的复制(C++解法)

news/2025/1/17 6:01:36/

题目

给你一个长度为 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]

C++代码

#include <iostream>
#include <unordered_map>
using namespace std;//创建链表结构体
struct Node {int val;Node* next;Node* random;Node(int x) : val(x), next(nullptr), random(nullptr) {}
};//创建哈希表保存原来的节点和相应的拷贝节点
unordered_map<Node*, Node*> cachedNode;
/*
* 创建新的节点进行拷贝,使用递归得到当前节点的后继节点
,当前节点的随机指针指向的节点
*/
Node* copyRandomList(Node* head) {if (head == nullptr) {return nullptr;}if (!cachedNode.count(head)) {Node* headNew = new Node(head->val);cachedNode[head] = headNew;headNew->next = copyRandomList(head->next);headNew->random = copyRandomList(head->random);}return cachedNode[head];
}int main() {Node* n1 = new Node(7);Node* n2 = new Node(13);Node* n3 = new Node(11);Node* n4 = new Node(10);Node* n5 = new Node(1);n1->next = n2;n2->next = n3;n3->next = n4;n4->next = n5;n5->next = nullptr;n1->random = nullptr;n2->random = n1;n3->random = n5;n4->random = n3;n5->random = n1;Node* head = n1;Node* headNew = copyRandomList(head);while (headNew) {cout << headNew->val << " " << headNew->random << endl;headNew = headNew->next;}return 0;
}

分析

对于深拷贝问题,利用回溯的方式,让每个节点的拷贝操作相互独立,并且创建哈希表保存原来的节点和相应的拷贝节点。对于当前节点,我们首先要进行拷贝,然后我们进行「当前节点的后继节点」和「当前节点的随机指针指向的节点」拷贝,拷贝完成后将创建的新节点的指针返回,即可完成当前节点的两指针的赋值。


http://www.ppmy.cn/news/1187078.html

相关文章

数字经济之于城市碳排放:“加速器”抑或“减速带”?

数据简介&#xff1a;数字经济是我国经济高质量发展的核心驱动力&#xff0c;在提升碳福利绩效过程中发挥重要作用&#xff0c;其在许多方面都能提供减少碳排放的机会。通过数字化和物联网技术&#xff0c;能源系统、交通运输、城市规划等领域可以实现智能化管理和优化&#xf…

使用requests库进行HTTP爬虫编程

目录 一、安装requests库 二、发送HTTP请求 三、解析HTML页面 四、处理HTTP响应和异常 五、使用代理和会话管理 六、使用多线程或多进程提高效率 七、数据存储和处理 八、注意事项和总结 在当今的数字化世界中&#xff0c;数据已经成为了一种宝贵的资源。而网络爬虫程序…

JVM基础:字节码文件详解①

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、Java虚拟机的组成二、字节码文件的组成2.1 为什么要了解字节码文件&#xff1f;2.2 如何“窥探”字节码文件的奥秘&#xff1f;2.2.1 使用工具打开字节码文件2.…

win下常用命令

windows下查看端口的方法&#xff1a; netstat -ano 开始远程控制&#xff1a;控制台输入mstsc 关闭Hyper-V bcdedit /set hypervisorlaunchtype off 开启Hyper-Vbcdedit /set hypervisorlaunchtype auto

【网络协议】聊聊套接字socket

网络编程我们知道是通过socket进行编程的&#xff0c;其实socket也是基于TCP和UDP协议进行编程的。但是在socket层面是感知不到下层的&#xff0c;所以在设置参数的时候&#xff0c;其实是端到端协议智商的网络层和传输层。TCP是数据流所以设置为SOCK_STREAM&#xff0c;而UDP是…

Undefined reference错误处理及Linux设置动态链接库so的默认搜索路径

文章目录 1 问题的提出2 问题的分析3 问题的解决3.1 Windows的VS修改配置属性3.2 Linux系统里添加搜索路径json在/usr/llib目录中libcryto.so在/usr/lib64文件夹中 Linux设置动态链接库so的默认搜索路径方法一&#xff1a;修改 ld.so.conf 文件方法二&#xff1a;修改环境变量方…

嵌入式基础知识-RSA非对称加密基本原理

之前的文章嵌入式基础知识-信息安全与加密&#xff0c;介绍过数据加密的一些基本概念&#xff0c;对称加密的原理比较简单&#xff0c;加密和解密的密钥相同&#xff0c;而非对称加密&#xff0c;两个密钥不同&#xff0c;本篇就来具体介绍RSA这种非对称加密的密钥计算原理。 …

视频无痕去水印怎么去,这三个神器轻松去除

视频无痕去水印怎么去&#xff1f;各位小伙伴在初学剪视频的时候是不是和我一样经常会碰到一个烦人的问题&#xff1a;在网上找到的视频素材总是带着讨厌的水印&#xff0c;不仅影响美观还挡住了视频的一些部分&#xff0c;让人特别不爽&#xff0c;我想各位遇到这种情况的时候…