【链表】Leetcode 138. 随机链表的复制【中等】

随机链表的复制

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

解题思路

  • 使用哈希表来存储原链表节点和复制链表节点的对应关系。

  • 第一次遍历:创建新节点并构建原链表节点和新节点的映射关系。同时,复制节点的 val 值和 next 指针。

  • 第二次遍历:根据原链表的 random 指针,为复制链表的对应节点设置 random 指针。

java实现

class Node {int val;Node next;Node random;public Node(int val) {this.val = val;this.next = null;this.random = null;}
}public class DeepCopyLinkedList {public Node copyRandomList(Node head) {if (head == null) {return null;}// 第一次遍历:创建新节点并构建原链表节点和新节点的映射关系Map<Node, Node> map = new HashMap<>();Node current = head;while (current != null) {map.put(current, new Node(current.val));current = current.next;}// 第二次遍历:根据原链表的 random 指针,为复制链表的对应节点设置 random 指针current = head;while (current != null) {Node copyNode = map.get(current);copyNode.next = map.get(current.next);copyNode.random = map.get(current.random);current = current.next;}return map.get(head);}public static void main(String[] args) {// 构造链表 1 -> 2 -> 3 -> 4 -> 5Node head = new Node(1);head.next = new Node(2);head.next.next = new Node(3);head.next.next.next = new Node(4);head.next.next.next.next = new Node(5);// 设置 random 指针head.random = head.next.next;  // 1.random --> 3head.next.random = head.next.next.next;  // 2.random --> 4head.next.next.random = head;  // 3.random --> 1head.next.next.next.random = null;  // 4.random --> nullhead.next.next.next.next.random = head.next;  // 5.random --> 2// 调用 copyRandomList 方法进行深拷贝DeepCopyLinkedList solution = new DeepCopyLinkedList();Node copiedHead = solution.copyRandomList(head);// 打印复制链表while (copiedHead != null) {System.out.print("[" + copiedHead.val +", " + (copiedHead.random != null ? copiedHead.random.val : "null") +"] ");copiedHead = copiedHead.next;}// 输出:[1, 3] [2, 4] [3, 1] [4, null] [5, 2]}
}

时间空间复杂度

  • 时间复杂度:O(n),其中 n 是链表的长度。
  • 空间复杂度:O(n),需要额外的空间存储新节点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/774787.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python地图添加指北针和比例尺】

文章目录 1、前言2、代码2.1、指北针2.2、比例尺 3、结果 1、前言 地理信息绘制中添加指北针和比例尺&#xff0c;使得图像更专业。 2、代码 2.1、指北针 def add_north(ax, labelsize18, loc_x0.95, loc_y0.99, width0.06, height0.09, pad0.14):"""画一个…

亚马逊云科技:基于老服务器打造的旧实例类型

内容摘要&#xff1a; 2021年&#xff0c;距离第一个EC2实例上线已经十五周年了。 在漫长的开发过程中&#xff0c;很多EC2实例自然会基于旧服务器构建。 随着时间的推移&#xff0c;旧的服务器总是需要更换硬件&#xff0c;实例也得更换&#xff0c;但并不是所有的用户都想迁…

20个Nginx经典面试题

在准备Nginx相关的技术面试时&#xff0c;了解一些常见的面试问题是非常重要的。以下是根据提供的文件内容&#xff0c;总结出的20个Nginx面试中常被问到的问题及其答案。 请解释一下什么是Nginx? Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP…

ZYNQ学习之Ubuntu系统的简单设置与文本编辑

基本都是摘抄正点原子的文章&#xff1a;<领航者 ZYNQ 之嵌入式Linux 开发指南 V3.2.pdf&#xff0c;因初次学习&#xff0c;仅作学习摘录之用&#xff0c;有不懂之处后续会继续更新~ 一、Ubuntu的简单操作 1.1 切换拼音输入法 Ubuntu 自带的拼音输入法&#xff0c;有两种…

C语言程序编译与链接(拓宽视野的不二之选)

文章目录 翻译环境和运行环境翻译环境预处理编译汇编链接 运行环境 翻译环境和运行环境 1&#xff0c;在ANSI C的任何⼀种实现中&#xff0c;存在两个不同的环境。 第1种是翻译环境&#xff0c;在这个环境中源代码被转换为可执⾏的机器指 令&#xff08;⼆进制指令&#…

WEB DDOS的安全策略

近年来网络攻击的数量和频率急剧上升&#xff0c;针对Web应用程序的DDoS海啸攻击就是其中增长非常迅速的一个种类。过去常见的HTTP/S洪水攻击正在大范围的转变为更难对付的Web DDoS海啸攻击&#xff0c;网络安全空间攻防对抗越演越烈&#xff0c;企业用户面临更加严峻的网络安全…

CCCorelib 点云RANSAC拟合平面(CloudCompare内置算法库)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 点云平面拟合的实质其实就是用一个拟合平面取代近似位于同一平面的点云,使点云中的所有点到拟合平面的距离平方和最小, 达到点云与拟合平面的高度吻合。已有的方法其实已有很多,如最小二乘法、特征值法等,本文将…

Vue 3中ref和reactive的区别

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Floyd算法 【多源最短路】模板

B3647 【模板】Floyd - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc.h> using namespace std; const int N1e210; const int inf0x3f3f3f; int n,m; int g[N][N]; void floyd() {for(int k1;k<n;k){for(int i1;i<n;i){for(int j1;j<n;j){g…

python工具方法 48 基于视觉大模型生成目标检测数据集

1、基本说明 1.1 lang-segment-anything Language Segment-Anything 是一个开源项目,它结合了实例分割和文本提示的强大功能,为图像中的特定对象生成蒙版。它建立在最近发布的 Meta 模型、segment-anything 和 GroundingDINO 检测模型之上,是一款易于使用且有效的对象检测…

取消自动设置的开机自启动(pywin32库)请勿仿照!否则可能对电脑造成损害。

本文使用创作助手。 要取消Python程序的开机自启动&#xff0c;可以通过删除注册表中相应的注册表项来实现。请按照以下步骤进行操作&#xff1a; 打开Windows注册表编辑器&#xff1a;按下 Windows R 键&#xff0c;输入 regedit&#xff0c;然后按下回车键。 导航到注册表…

1.简单使用SmartTable

愿你出走半生,归来仍是少年&#xff01; 环境&#xff1a;Android Studio 在android上进行统计数据、列表、表格数据等信息展示是常有的需求。 在Github上有一个优秀的控件&#xff1a;smartTable 1.功能介绍 快速配置自动生成表格&#xff1b;自动计算表格宽高&#xff1b;表…

低功耗、低成本 NAS 的可能性

使用现状&#xff1a;多台工作电脑&#xff0c;家里人手一台&#xff0c;还在两个住处 有好几台工作电脑&#xff0c;不同电脑有不同的用途&#xff0c;最大的问题就是各个电脑上文件的同步问题&#xff0c;这里当然就需要局域网里的公共文件夹&#xff0c;在NAS的问题上查了网…

Openwrt下适配Samba

关于Samba samba是Linux和Unix平台的一款实现了SMB协议的软件&#xff0c;可以使得windows平台的主机也可以访问Linux和Unix平台主机共享出来的资源。 SMB协议(Server Message Block)是由微软开发的一种软件程序级的网络传输协议&#xff0c;基于NetBIOS&#xff0c;主要功用…

【Canvas与艺术】模拟八一电影制片厂电影片头效果

【缘起】 八一厂每部电影前都有其专有开头&#xff0c;如&#xff1a;https://www.ixigua.com/6799821997258834440?logTag2eacce76401e13f9efe7 这个片头可以用canvas模拟下来。 【关键点】 线型放射状粒子系统的运作。 立体感五角星的绘制。 【图例】 【代码】 <!D…

开放大学2024年春《幼儿园环境创设 050546》过程性考核作业二:撰写一所幼儿园活动环境创设现状分析评价报告参考答案

答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 选择一所幼儿园&#xff0c;最好是你所在或者比较熟悉的园所&am…

单页面应用部署到iis上可以正常打开,刷新就404

当您遇到Dumi打包的网站部署到IIS上可以正常打开首页,但刷新页面时出现404错误的情况,这通常与以下几个方面有关: 路由处理: Dumi生成的项目通常基于SPA(Single Page Application)架构,使用前端路由来实现无刷新导航。这意味着大部分页面切换是在浏览器层面完成的,而不…

vc_red.msi 错误

建议将安装的软件解压&#xff0c;再安装&#xff0c;这样可以自动下载vc_red.msi. 不解压就会出现这个错误。

unity学习(73)——服务器异常--无法处理 123类型的数据包

服务器发送回的数据包&#xff0c;客户端根本读不出来&#xff0c;type都读不出来&#xff0c;拖了三天&#xff0c;把客户端翻了个底朝天&#xff0c;发现客户端一点问题都没有&#xff01; 所有的问题不是unity的模型问题&#xff0c;就是socket网络通信中断&#xff01; 1…

C++ 控制语句(一)

一 顺序结构 程序的基本结构有三种&#xff1a; 顺序结构、分支结构、循环结构 大量的实际问题需要通过各种控制流程来解决。 1.1 顺序结构 1.2 简单语句和复合语句 二 循环 2.1 for循环 语句流程图 注意&#xff1a;使用for语句的灵活性 三 while语句 四 do while语句