随机链表的复制 - LeetCode 热题 32

大家好!我是曾续缘💤

今天是《LeetCode 热题 100》系列

发车第 32 天

链表第 11 题

❤️点赞 👍 收藏 ⭐再看,养成习惯

随机链表的复制

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

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

例如,如果原链表中有 XY 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 xy ,同样有 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]]

提示:

  • 0 <= n <= 1000
  • -104 <= Node.val <= 104
  • Node.random 为 null 或指向链表中的节点。
难度:💖💖

解题方法

这道题是关于链表的深拷贝,其中每个节点除了有 next 指针外,还有一个 random 指针指向链表中的任意节点或空节点。我们需要实现一个方法来复制这个链表并返回复制链表的头节点。

我们使用哈希表存储已经创建过的节点,避免重复创建;递归遍历链表进行复制。

  1. 创建一个哈希表 mp 用于存储原节点和对应的复制节点。
  2. 在递归函数中,首先判断当前节点是否为空,如果为空则返回 null。
  3. 然后判断当前节点是否已经被复制过,如果没有,则创建一个新节点,并将原节点和对应的新节点存入哈希表。
  4. 接着递归地复制下一个节点和随机指针所指向的节点。
  5. 返回复制节点,完成整个递归过程。

Code

/*
// Definition for a Node.
class Node {int val;Node next;Node random;public Node(int val) {this.val = val;this.next = null;this.random = null;}
}
*/class Solution {Map<Node, Node> mp = new HashMap<Node, Node>();public Node copyRandomList(Node head) {if(head == null){return null;}if(!mp.containsKey(head)){Node h = new Node(head.val);mp.put(head, h);h.next = copyRandomList(head.next);h.random = copyRandomList(head.random);}return mp.get(head);}
}

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

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

相关文章

TPS70401系列双输出、低压差线性稳压器(LDO)的数据手册

这份文件是关于德州仪器(Texas Instruments)公司生产的TPS70401系列双输出、低压差线性稳压器(LDO)的数据手册。这些稳压器专为分压供电系统设计,具有集成的系统电压监控器(SVS)功能,适用于需要高电流输出和低静态电流的应用。 以下是这些低压差线性稳压器的核心特点和…

(四)PostgreSQL的psql命令

PostgreSQL的psql命令 基础信息 OS版本&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a;16.2 pg软件目录&#xff1a;/home/pg16/soft pg数据目录&#xff1a;/home/pg16/data 端口&#xff1a;5777psql 是 PostgreSQL 数据库的命令行界面…

NASA数据集——ACCLIP WB-57 Aircraft 飞机合并数据

ACCLIP WB-57 Aircraft Merge Data ACCLIP WB-57 飞机合并数据 简介 ACCLIP_Merge_WB57-Aircraft_Data 是在亚洲夏季季风化学和气候影响项目&#xff08;ACCLIP&#xff09;期间从 WB-57 飞机上收集的各种现场仪器测量数据预先生成的合并文件。该产品的数据收集工作已经完成。…

【leetcode面试经典150题】28.盛最多水的容器(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

Python Ecosystem之Pandas使用记录

高亮颜色说明&#xff1a;突出重点 个人觉得&#xff0c;&#xff1a;待核准个人观点是否有误 高亮颜色超链接 文章目录 读写excel文件操作问题SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. 二级标题待补充待补充 读写excel文…

设计模式之结构型模式---代理模式

代理模式是一种结构型设计模式&#xff0c;它为目标对象提供一种代理&#xff0c;以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介的作用&#xff0c;客户端通过代理类与目标对象进行交互&#xff0c;而不是直接与目标对象进行交互。 代理模式的应用场景非常…

漫步密度森林:借助HDBSCAN实现高效数据聚类

文章来源&#xff1a;navigating-the-density-forest-harnessing-hdbscan-for-advanced-data-clustering 2024 年 4 月 9 日 介绍 在数据科学中&#xff0c;聚类算法是揭示数据集内在结构的重要工具。在这些工具中&#xff0c;基于分层密度的噪声应用空间聚类 (HDBSCAN) 作为…

一篇文章深入学习Java的AQS(AbstractQueuedSynchronizer)

深入理解AQS的设计和工作机制 Oracle官方文档中的AbstractQueuedSynchronizer部分讲解 AbstractQueuedSynchronizer&#xff08;简称AQS&#xff09;是Java并发包中的一个基础框架&#xff0c;它为实现依赖单个原子变量来表示状态的同步器提供了可靠的基础。这个框架被广泛用…

【leetcode面试经典150题】48. 汇总区间(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

【C++学习】C++11新特性(第一节)

文章目录 ♫一.文章前言♫二.C11新特性♫一.统一的列表初始化♫二.std::initializer_list♫三.声明♫四.decltype关键字♫五.nullptr♫六.新增加容器---静态数组array、forward_list以及unordered系列♫6.1unordered_map与unoredered_set♫6.2array♫6.3 forward_list&#xff…

【Altium Designer 20 笔记】隐藏PCB上的信号线(连接线)

使用网络类隐藏特定类型的信号线 如果你想要隐藏特定类型的信号线&#xff08;例如电源类&#xff09;&#xff0c;你可以首先创建一个网络类。使用快捷键DC调出对象类浏览器&#xff0c;在Net Classes中右击添加类&#xff0c;并重命名&#xff08;例如为“Power”&#xff0…

使用CDN服务对网页加载速度有何影响,如何选择合适的CDN提供商

使用CDN服务对网页加载速度有显著的正面影响。CDN&#xff08;内容分发网络&#xff09;通过将内容缓存到全球各地的服务器节点上&#xff0c;使得用户可以从地理位置上最接近的节点获取数据&#xff0c;从而减少了数据传输的时间和延迟&#xff0c;加快了网页的加载速度。此外…

八大排序算法(面试被问到)

1.八大排序算法都是什么&#xff1f; 八大排序算法有&#xff1a;插入排序、冒泡排序、归并排序、选择排序、快速排序、希尔排序、堆排序、基数排序&#xff08;通常不提&#xff09;。此外&#xff0c;还可以直接调用Arrays.sort()进行排序。 2.八大排序算法时间复杂度和稳定…

centos编译安装nginx1.24

nginx编译1.24&#xff0c;先下载安装包 机器通外网的话配置nginx的yum源直接yum安装 vim /etc/yum.repos.d/nginx.repo [nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck1 enabled1 gpgkeyhttps://nginx.org…

maven bom

BOM(Bill of Materials)是由Maven提供的功能,它通过定义一整套相互兼容的jar包版本集合,使用时只需要依赖该BOM文件,即可放心的使用需要的依赖jar包,且无需再指定版本号。BOM的维护方负责版本升级,并保证BOM中定义的jar包版本之间的兼容性。 为什么要使用BOM 使用BOM除…

fastjson 序列化问题

问题: 使用fastjson 的 对同一个JSONObject对象 多次引用后, 通过 JSON.toJSONString() 方法进行json序列化时出现只有第一次的可以成功序列化未json string 字符串, 后面的对象都为引用地址; 示例: public static void main(String[] args) {JSONObject jsonObject new JSON…

每日练习——leetcode1047和239

目录 1047. 删除字符串中的所有相邻重复项 题目描述 解题思路 代码实现 239. 滑动窗口最大值 题目描述 解题思路 代码实现 1047. 删除字符串中的所有相邻重复项 题目描述 给出由小写字母组成的字符串 S&#xff0c;重复项删除操作会选择两个相邻且相同的字母&#xf…

棋盘(c++题解)

题目描述 有一个m m的棋盘&#xff0c;棋盘上每一个格子可能是红色、黄色或没有任何颜色的。你现在要从棋盘的最左上角走到棋盘的最右下角。 任何一个时刻&#xff0c;你所站在的位置必须是有颜色的&#xff08;不能是无色的&#xff09; &#xff0c;你只能向上、下、 左、右…

7 个适用于 Windows 的最佳电脑分区数据恢复软件

磁盘分区对于正确存储数据以便从硬盘驱动器快速轻松地访问非常有帮助。但是&#xff0c;如果分区损坏&#xff0c;存储在其中的所有数据都会突然变得无法访问。磁盘分区损坏的原因可能有很多&#xff0c;其中最突出的是病毒攻击、突然断电、物理损坏或由于创建坏扇区。 但是&a…

eNSP-抓包解析TCP三次握手和四次挥手的过程

一、环境搭建 1.设备连接 并 启动所有设备 2.服务器配置 3.客服端配置 二、抓包测试 1.打开抓包软件 2.客户端获取数据 三、抓包结果