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

【Leetcode Top 100】138. 随机链表的复制

问题背景

给你一个长度为 n n n 的链表,每个节点包含一个额外增加的随机指针 r a n d o m random random,该指针可以指向链表中的任何节点或空节。
构造这个链表的 深拷贝。 深拷贝应该正好由 n n n全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 n e x t next next 指针和 r a n d o m random random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点
例如,如果原链表中有 X X X Y Y Y 两个节点,其中 X . r a n d o m = Y X.random = Y X.random=Y。那么在复制链表中对应的两个节点 x x x y y y,同样有 x . r a n d o m = y x.random = y x.random=y
返回复制链表的头节点。

数据约束

  • 0 ≤ n ≤ 1000 0 \le n \le 1000 0n1000
  • − 1 0 4 ≤ N o d e . v a l ≤ 1 0 4 -10 ^ 4 \le Node.val \le 10 ^ 4 104Node.val104
  • N o d e . r a n d o m Node.random Node.random n u l l null null 或指向链表中的节点。

解题过程

经典链表操作题,解决的关键在于能否想到把新建的复制节点添加到原节点的后一个。
通过上述方案复制完整个链表之后,只要能够分离链表即可,参考 奇偶链表,本题中由于原链表的后一个节点是它本身的复制,一定存在,分离的时候可以少一个判断。

注意数据范围,头节点可能为空,要单独处理。

具体实现

/*
// 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 {public Node copyRandomList(Node head) {// 特判头节点为空的情形if(head == null) {return null;}// 在原链表的每个节点之后新建复制节点Node cur = head, next;while(cur != null) {next = cur.next;cur.next = new Node(cur.val, cur.next); // 题中没说明这个构造器,实际上是存在的cur.next.next = next;cur = cur.next.next;}// 重置工作指针cur = head;// 给每个新节点的随机域赋值while(cur != null) {if(cur.random != null) {cur.next.random = cur.random.next;}cur = cur.next.next;}// 分离原链表和复制之后的链表Node copyHead = head.next, copy;cur = head;while(cur.next.next != null) {copy = cur.next; // 记录下一个节点cur.next = cur.next.next; // 调整原链表的 next 指针copy.next = copy.next.next; // 调整新链表的 next 指针cur = cur.next; // 后移工作指针}// 原链表的最后一个节点要指空cur.next = null;return copyHead;}
}
http://www.lryc.cn/news/497650.html

相关文章:

  • 2024年12月HarmonyOS应用开发者基础认证全新题库
  • Flink问题总结
  • Day17 C++ vector 容器
  • 常见Linux命令(详解)
  • AgGrid 组件封装设计笔记:自定义 icon 以及每个 icon 的点击事件处理
  • vb.net常用命名空间
  • Netty面试内容整理-Netty 工作原理
  • CMD 介绍
  • 【项目日记】仿mudou的高并发服务器 --- 实现HTTP服务器
  • Android 使用TabLayout + ViewPager2 实现标签页的视图切换
  • vue 项目实现阻止浏览器记住密码
  • 7. 一分钟读懂“单例模式”
  • 28个炫酷的纯CSS特效动画示例(含源代码)
  • 百问FB网络编程 - 主要函数介绍
  • Unity类银河战士恶魔城学习总结(P155 More example on audio effects更多的音效细节)
  • 【题解】—— LeetCode一周小结48
  • 040集——CAD中放烟花(CAD—C#二次开发入门)
  • 一文理解多模态大语言模型——下
  • ROS2创建 base 包用于其他模块的参数配置和头文件依赖
  • 自然语言处理期末试题汇总
  • 前端热门面试题目(四)——计算机网路篇
  • kubenetes流水线实施清单
  • Redis4——持久化与集群
  • 【LeetCode: 94. 二叉树的中序遍历 + 栈】
  • Python系列 - MQTT协议
  • 同时在github和gitee配置密钥
  • Runway 技术浅析(六):文本到视频(Text-to-Video)
  • 云计算vspere 安装过程
  • QT 实现QStackedWidget切换页面右移动画
  • Android Camera2采集并编码为H.264