Leetcode-138. 复制带随机指针的链表

我们用哈希表来解决这个问题
首先创建一个哈希表,再遍历原链表,遍历的同时再不断创建新节点
我们将原节点作为key,新节点作为value放入哈希表中

image.png

"""# Definition for a Node.class Node:def __init__(self, x: int, next: 'Node' = None, random: 'Node' = None):self.val = int(x)self.next = nextself.random = random"""class Solution:def copyRandomList(self, head: 'Optional[Node]') -> 'Optional[Node]':if not head:  # 关键补充return Noned=dict()p=headwhile p:new_node=Node(p.val,None,None)d[p]=new_nodep=p.nextp=headwhile p:if p.next:d[p].next=d[p.next]if p.random:    d[p].random=d[p.random]p=p.nextreturn d[head]

第一次循环(建映射,创建“影子节点”)

  • p 是原链表的当前节点(原节点对象)

  • 在字典 d 中:

    • key = p(原节点的引用)

    • value = Node(p.val, None, None)(一个新建节点对象的引用)

  • 此时新建节点的 nextrandom 都是 None,所以这些新节点是“孤立点”

例子:
原链表: A → B → C
哈希表:

d[A] = A'(next=None, random=None)
d[B] = B'(next=None, random=None)
d[C] = C'(next=None, random=None)

第二次循环(接指针,补全结构)

  • 目的:把 d[p](新节点)内部的 next / random 指针补好

  • 补 next:

    • 原链表: p.next 是原节点的下一个

    • 新链表: d[p].next 应该指向 d[p.next](下一个原节点对应的新节点)

  • 补 random:

    • 原链表: p.random 是原节点的随机指向

    • 新链表: d[p].random 应该指向 d[p.random](原节点随机指向对应的新节点)

例子(假设 A.random → C):
第二次循环后:

A'.next = B'
B'.next = C'
A'.random = C'

这样,新链表的节点之间关系和原链表完全一致,但对象是全新的。


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MATLAB 2025a】安装离线帮助文档

文章目录一、在 MATLAB 设置中安装二、从math works 网站下载ISO:适用于给无法联网的电脑安装或自定义路径三、startup文件说明四、重要说明🧩🧩【Matlab】最新版2025a发布,深色模式、Copilot编程助手上线! 版本&#…

JDK21虚拟线程和 Golang1.24协程的比较

文章目录前言1、技术原理与实现机制1.1、JDK21虚拟线程本质:调度机制:内存管理:编程模型:1.2. Go 1.24协程GMP调度模型:抢占式调度:内存优化:编程模型:2、性能对比分析2.1、CPU密集型…

聊天室全栈开发-保姆级教程(Node.js+Websocket+Redis+HTML+CSS)

前言 最近在学习websocket全双工通信,想要做一个联机小游戏,做游戏之前先做一个聊天室练练手。 跟着本篇博客,可以从0搭建一个属于你自己的聊天室。 准备阶段 什么人适合学习本篇文章? 答:前端开发者,有一…

Android Coil3视频封面抽取封面帧存Disk缓存,Kotlin

Android Coil3视频封面抽取封面帧存Disk缓存&#xff0c;Kotlin <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE" /><uses-permis…

Python网络爬虫(一) - 爬取静态网页

文章目录一、静态网页概述1. 静态网页介绍2. 静态网页爬取技术Requests介绍二、安装 Requests 库三、发送请求并获取响应1. 发送 GET 请求1.1 get() 方法介绍1.2 get() 方法签名介绍1.3 get() 方法参数介绍1.4 示例&#xff1a;发送get请求2. 发送 POST 请求2.1 post() 方法介绍…

企业级WEB应用服务器TOMCAT

企业级WEB应用服务器TOMCAT 一、WEB技术 1.1 HTTP协议和B/S结构 操作系统有进程子系统&#xff0c;使用多进程就可以充分利用硬件资源。进程中可以多个线程&#xff0c;每一个线程可以被CPU调度执行&#xff0c;这样就可以让程序并行的执行。这样一台主机就可以作为一个服务器为…

Linux 系统中,如何处理信号以避免竞态条件并确保程序稳定性?

在 Unix/Linux 系统中&#xff0c;处理信号时避免竞态条件&#xff08;Race Conditions&#xff09;并确保程序稳定性需要遵循关键原则和技巧。以下是核心方法&#xff1a; 1. 保持信号处理函数&#xff08;Signal Handler&#xff09;简单 仅设置标志位&#xff1a;在信号处理…

【Matplotlib】中文显示问题

中文显示问题本地Mac上作图&#xff0c;可以方便地实现中文字体显示。比如在Jupter中&#xff0c;通过&#xff1a;方法一&#xff1a;不下载字体库即可实现中文显示 (MAC)plt.rcParams[font.family][Arial Unicode MS]方法二&#xff1a;下载指定字体训即可实现中文显示plt.rc…

【Linux指南】Vim的全面解析与深度应用

引言 在Linux的命令行宇宙中&#xff0c;Vim如同一位全能的工匠&#xff0c;以独特的模式化操作和高度定制化能力&#xff0c;成为开发者与运维人员不可或缺的工具。从基础的文本编辑到复杂的代码开发&#xff0c;Vim通过灵活切换的多种模式&#xff0c;将每一个按键转化为高效…

Excel版经纬度和百分度互转v1.1

很多童鞋在工作中经常需要用到坐标&#xff0c;其中百分度和度分秒的转换常常需要依赖各种软件&#xff0c;但这些软件往往不如excel表格方便&#xff0c;因此本人开发了一个依据vba的度分秒和百分度转换表格&#xff0c;这个表格基于office2010开发&#xff0c;非常简单&#…

计算机网络:如何理解目的网络不再是一个完整的分类网络

这一理解主要源于无分类域间路由&#xff08;CIDR&#xff09;技术的广泛应用&#xff0c;它打破了传统的基于类的IP地址分配方式。具体可从以下方面理解&#xff1a; 传统分类网络的局限性&#xff1a;在早期互联网中&#xff0c;IP地址被分为A、B、C等固定类别&#xff0c;每…

FFmpeg实现音视频转码

以下是基于 FFmpeg 库实现 MP4 转码的详细步骤&#xff08;以 C 语言为例&#xff09;&#xff1a; 一、环境准备 集成 FFmpeg 库 编译 FFmpeg 生成动态库&#xff08;avformat、avcodec、avutil、swscale、swresample等&#xff09; 在 SDK 项目中配置头文件路径和库文件链接…