当前位置: 首页 > news >正文

【链表】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.lryc.cn/news/326609.html

相关文章:

  • 【计算机网络教程】(第六版)第2章课后习题答案
  • 抖音电商“达人客服”产品上线啦!超多作者邀你一起“321上客服”!
  • 华为防火墙二层墙(VAN/SVI/单臂路由)
  • idea使用git笔记
  • 智慧校园数据可视化有什么好处?怎么推进数字化校园方案?
  • 如何利用python编写函数fn(a,n)求数列和
  • django orm DateTimeField 6位小数精度问题
  • JVM(六)——内存模型与高效并发
  • C++:关键字(4)
  • STM32串口收发单字节数据原理及程序实现
  • openGauss + Datakit搭建openGauss运维平台
  • 【疑惑】-谷歌是如何获取数据的
  • Java static和继承
  • 亲身体验!人工智能对话无障碍 —— BRClient 使用指南
  • 【数据库管理操作】Mysql 创建学生数据库及对数据表进行修改
  • vue2 export default写法,computed、methods的使用
  • 负氧离子监测站:创造健康生活环境
  • 【jvm】young gc full gc
  • 2024年腾讯云服务器租用价格_轻量和CVM报价
  • 【go从入门到精通】for循环控制
  • <chrono>, clock_gettime(), gettimeofday()对比
  • 基于 YAML 接口自动化测试框架设计
  • 团体程序设计天梯赛 L2-031 深入虎穴
  • 基于Givens旋转完成QR分解进而求解实矩阵的逆矩阵
  • 学习使用xbox手柄控制小乌龟节点移动
  • OpenLayers6实战,OpenLayers绘制特殊图形,OpenLayers绘制四角形(菱形),OpenLayers绘制菱形
  • 虚拟机如何在原有磁盘上扩容
  • 2024-03-27 作业
  • C语言二叉树和堆(个人笔记)
  • 重学SpringBoot3-Profiles介绍