剑指offer35 复杂链表的复制

news2025/2/13 3:10:01

复杂链表的复制

文章目录

    • 复杂链表的复制
      • 方法一 回溯+哈希表
        • 第二种解释
      • 方法二:拼接+拆分
        • 算法流程
    • 参考文献

本题要求我们对一个复杂链表进行复制。在复杂链表中,每个节点除了有一个next指针指向下一个节点,还有一个random指针指向链表中的任意节点或者null.

例1 下图是一个带有随机指针的复杂链表。用一个长度为2的列表表示每个节点,第一个元素表示当前节点的val, 第二个元素表示random指针指向的元素的索引(如果指向null, 则记为null)。则下列复杂链表可以记为:

在这里插入图片描述

[[7, null], [13, 0], [11, 4], [10, 2], [1, 0]]

需要对复杂链表进行复制,输出和输入需要相同,仍然为:

[[7, null], [13, 0], [11, 4], [10, 2], [1, 0]]

方法一 回溯+哈希表

本题要求我们对一个特殊的链表进行深拷贝。如果是普通链表,我们可以直接按照遍历的顺序创建链表节点。而本题中因为随机指针的存在,当我们拷贝节点时,当前节点的随机指针指向的节点可能还没创建,因此我们需要变换思路。

一个可行方案是,我们利用回溯的方式,让每个节点的拷贝操作相互独立。对于当前节点,我们首先要进行拷贝,然后我们进行当前节点的后继节点和当前节点的随机指针指向的节点拷贝,拷贝完成后将创建的新节点的指针返回,即可完成当前节点的两指针的赋值。

具体地,我们用哈希表记录每一个节点对应新节点的创建情况。遍历该链表的过程中,我们检查当前节点的后继节点和当前节点的随机指针指向的节点的创建情况。如果这两个节点的任何一个节点的新节点没有被创建,我们都立刻递归地进行创建。当我们拷贝完成,回溯到当前层时,我们即可完成当前节点的指针赋值。

注意一个节点可能被多个其他节点指向,因此我们可能递归地多次尝试拷贝某个节点,为了防止重复拷贝,我们需要首先检查当前节点是否被拷贝过,如果已经拷贝过,我们可以直接从哈希表中取出拷贝后的节点的指针并返回即可。

在实际代码中,我们需要特别判断给定节点为空节点的情况。

第二种解释

利用哈希表的查询特点,考虑构建原链表节点和新链表对应节点的键值对映射关系,再遍历构建新链表各个节点的next和random引用指向即可。

算法流程:

1.若头结点head为空节点,则直接返回null

2.初始化:哈希表dic, 节点cur指向头结点

3.复制链表:

  • 建立新节点,并向dic添加键值对(原cur节点,新cur节点)
  • cur遍历至原链表下一节点。

4.构建新链表的引用指向

  • 构建新节点的next和random引用指向。
  • cur遍历至原链表下一节点。

方法二:拼接+拆分

考虑构建原节点1->新节点1->原节点2->新节点2->......的拼接链表,如此便可在访问原节点的random指向节点的同时找到心对应新节点的random指向节点。

算法流程

1.复制各节点,构建拼接链表

  • 设原链表为node1->node2->…,构建的拼接链表如下所示:
    • node1->node1_new -> node2->node2_new -> …

2.构建新链表各个节点的random指向

  • 当访问原节点的cur的随机指向节点cur->random时,对应新节点cur.next的随机指向节点为cur->random->next;

3.拆分原/新链表

  • 设置pre/cur分别指向原/新链表的头结点,遍历执行pre->next = pre->next->next和cur->next = cur->next->next,将两链表拆分开。

4.返回新链表的头结点res即可。

参考文献

[1] https://leetcode.cn/problems/fu-za-lian-biao-de-fu-zhi-lcof/solution/jian-zhi-offer-35-fu-za-lian-biao-de-fu-zhi-ha-xi-/

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

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

相关文章

SpringBoot+Vue 车辆充电桩系统

文章目录 1、效果演示效果图技术栈 2、 前言介绍(完整源码请私聊)3、主要技术3.4.1 数据库概念结构设计3.4.2 数据库具体设计 4 系统功能的具体实现4.1 前台功能模块4.1.1 首页功能4.1.2 用户后台管理 4.2 后台功能模块4.2.1 管理员功能4.2.2 维修员功能…

后端(三):后端实战(表白墙的设计)

上一章结束了 Servlet 的学习,ok,现在我们已经学会了 1 1 了,现在开始我们要学会 百以内的加减乘除法。 本章就做一个最简单的 小小项目:表白墙。 在开始表白墙项目开始之间,我们先提前说好,这里主要跟关…

海思3559万能平台搭建:SPI输出h264码流

前言 面对各种各样的客户需求,spi接口也是一种传码流的形式,spi同步422可以保证抗干扰能力强的同时传输距离也很长,本文会介绍海思平台spi作为主机的发送功能以及发送码流的处理方式 1. 管脚复用: 首先需要配置的肯定是管脚复用&…

java容器排序

Java的容器 在Java中,我们想要保存对象可以使用很多种手段。最简单的就是数组。但是数组具有固定的尺寸,而通常来说,程序总是在运行时根据条件来创建对象,我们无法预知将要创建对象的个数以及类型,所以Java推出了容器…

动态规划-最长的回文序列

这里写自定义目录标题 1 描述2 样例2.1 样例12.2 样例2 3 解题思路以及实现方法3.1 解题思路3.1.1 确定状态3.1.2 转移方程3.1.3 初始条件和边界情况3.1.4 计算顺序 3.2 题解3.2.1 C实现3.2.2 java实现 该题是lintcode上 667 最长的回文序列,该题的解题思路亦是参…

方法选对,事半功倍:数据分析方法

人们发明了数据可视化,利用人类大脑更善于处理图像信息的特点,透过图形化的手段,用图表清晰有效地传达和沟通信息。把以往庞杂、繁乱的数据报表转化成简洁明了的可视化图表。 通过数据可视化制作出的图表,不再像传统分析方案那样…

JavaScript Web APIs学习总结

以后声明变量我们有限使用哪一个? const 有了变量先给const,如果发现它后面是要被修改的,再改为let 为什么const声明的对象可以修改里面的属性? 因为对象是引用类型,里面存储的是地址,只要地址不变&…

月入6000+的CSGO游戏搬砖项目操作细节和要求

月入6000的CSGO游戏搬砖项目操作细节和要求 最近咨询CSGO搬砖项目的人较多,在此整理一份统一的项目操作细节和要求。 1、什么是国外Steam游戏装备汇率差项目? 这个项目的基本原理是:购买国外Steam游戏平台上的装备,再在国内网易…

SSR渲染--02--nuxt demo(vue)

cmd 打开命令提示符,创建nuxt npm i create-nuxt-app -g create-nuxt-app vue-honor-of-kings(这个是我的项目名,输入自己的项目名) npm run dev创建的具体配置 【写demo为了方便,我直接下载了Element的包&#xff0…

游戏画面延迟的原因及解决方法

游戏画面延迟,是玩家在游戏中操作后,画面反应出现滞后或卡顿的现象。这会严重影响玩家的游戏体验和竞技水平,尤其是在一些需要高速反应和精确操作的3A大作中,画面延迟可能导致玩家错失良机或者被敌人击败。 那么,游戏…

电能质量监测装置在某半导体公司的应用

摘 要:半导体生产制造业在国民经济中起着举足轻重的作用,相关企业的规模也越来越大。其供配电系统稳定、可靠的运维不仅是其安全生产的基本保证,还关系到产品质量和生产的顺利进行。而半导体行业中大部分工艺设备对电能质量比较敏感&#xff…

《CDP企业数据云平台从入门到实践》——如何迁移CDH/HDP到CDP(2)

原文:《CDP企业数据云平台从入门到实践》——如何迁移CDH/HDP到CDP(2)-阿里云开发者社区 简介: 《CDP企业数据云平台从入门到实践》——如何迁移CDH/HDP到CDP(2) 《CDP企业数据云平台从入门到实践》——如…

Windows安装和配置VCenter

Vcenter的环境搭建和配置 Vcenter简介 Vcenter一般指 VMware vCenter™ Server,VMware vCenterServer 提供了一个可伸缩、可扩展的平台,为 虚拟化管理奠定了基础。 VMware vCenter Server(以前称为 VMware VirtualCenter)&#…

Qt6.5.1+WebRTC学习笔记(十一)开发环境搭建(ubuntu22.04)

前言 win10开发测试已经一段时间了,最近将程序移植到ubuntu测试了下,改动不是很大,本教程记录下环境搭建过程 一、准备 1.操作系统ubuntu22.04 64位 x86架构(建议更新到最新) 2.合理的上网方式,需要正常…

模板匹配笔记

模板匹配是一种最基本、最原始的模式识别的方法。通过对比某一特定物体的图案位于图像的什么地方,进而识别出物体。它是图像处理中最基本、最常用的匹配方法。它的局限性主要是它只能进行平行移动,若原图像中的匹配目标发生旋转或大小变化,该…

运维(SRE)成长之路-第2天 文本编辑工具之神VIM

vi和vim简介 在Linux中我们经常编辑修改文本文件,即由ASCII, Unicode 或其它编码的纯文字的文件。之前介绍过nano,实际工作中我们会使用更为专业,功能强大的工具 文本编辑种类: 全屏编辑器:nano(字符工具…

Spark SQL数据源:Parquet文件

文章目录 一、Parquet简介二、读取和写入Parquet的方法(一)利用parquet()方法读取parquet文件1、数据准备2、读取parquet文件3、显示数据帧内容 (二)利用parquet()方法写入parquet文件1、写入parquet文件2、查看生成的parquet文件…

Spring Security--多个过滤器链和多个用户表

请求从客户端出发,到达客户端,也就是servlet,中间有很多过滤器的,其中就有一个过滤器链代理,里面包含了过滤器的一个集合。而且Spring Security Filter并不是直接嵌入到Web Filter中的,而是通过FilterChain…

海纳“千川”:得物多场景统一推荐平台|精选

1 千川由来 得物的推荐场景,除了首页瀑布流等几个比较大的场景之外,还有很多长尾的小场景,包括:频道、会场、购中购后场景、品牌墙等。这类场景存在单个场景体量小(UV和GMV均偏小)、场景零散、类型多元的情…

炫龙笔记本怎么用U盘重装Win10系统?

炫龙笔记本怎么用U盘重装Win10系统?很多使用炫龙笔记本电脑的用户在问,怎么使用U盘来重装一下电脑的Win10系统,这时候用户先要准备一个U盘,还有一个能够正常联网的炫龙笔记本电脑,最后按照以下炫龙笔记本用U盘重装Win1…