leetcode做题笔记138. 复制带随机指针的链表

2023-09-14 20:14:48

给你一个长度为 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 作为传入参数。

思路一:回溯

c语言解法

struct Node* copyRandomList(struct Node* head) {
        struct Node* cur=head;
        while(cur)
        {
            struct Node* next=cur->next;
            struct Node* copy=(struct Node*)malloc(sizeof(struct Node));
            copy->val=cur->val;

            cur->next=copy;
            copy->next=next;

            cur=next;
        }
        cur=head;
            while(cur)
        {
            struct Node* copy=cur->next;
            if(cur->random==NULL)
            {
                copy->random=NULL;
            }
            else
            {
                copy->random=cur->random->next;

            }
            cur=copy->next;
        }
        cur=head;
        struct Node* copyhead=NULL,*copytail=NULL;
        while(cur)
        {
            struct Node* copy=cur->next;
            struct Node* next=copy->next;

            if(copytail==NULL)
            {
                copytail=copyhead=copy;
            }
            else
            {
                copytail->next=copy;
                copytail=copytail->next;

            }
            cur->next=next;

            cur=next;
        }
        return copyhead;
        }

分析:

本题要对一个特殊的链表进行复制,这个链表每个节点包含一个额外增加的随机指针 random,可以先将该链表每个节点记录下来,当记录的节点的指针指向空节点时原复制的节点也指向空,最后将操作完的链表用copytail连接起来,最后输出copyhead

总结:

本题考察对链表的操作,要将链表深拷贝即将链表复制下来再根据具体情况添加最后连接后返回

更多推荐

jvm-sandbox-repeater时间mock插件设计与实现

一、背景jvm-sandbox-repeater实现了基础的录制回放流程编排,并简单的给了几个插件的demo,离实际项目运用其实还需要二次开发很多东西,其中时间mock能力是一个非常基础的能力,业务代码里经常需要用到这块;二、调研2.1如何mock当前时间我们mock的主要是"当前时间",java里获取当前时间的主要方

【CSS】font-weight设置为500显示不出加粗效果

问题出在操作系统上:macOS系统默认的华文黑体(STHeiti)有七个矢量级别:Heavy/Bold/MediumP4/Regular/Thin/Light/UltraLightP2,它包含上面CSS中设定的500这个精度。Windows系统默认的宋体(simsun)没有那么多级别。在缺少级别支持的前提下,CSS会根

【笔记】简单算法查找、排序的思路和优化

系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章Python机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言一、二分查找1、思路2、初步代码复现3、整数溢出的情况如图:中间索引上的值+右边界索引上的值会造成`

成为绝地求生高手的秘密武器,精准作图、库存查询与封禁防护一网打尽!

想要在绝地求生中成为巅峰玩家,除了优秀的游戏技巧和战斗意识外,还需要掌握一些绝密武器,帮助你科学作图、查询库存,甚至保护账号不被骗和封禁。下面就为你揭秘,让你轻松提升战斗力,引领游戏潮流!首先,作图工具是每个高手必备的利器之一。我们网站提供一系列方便作图的工具推荐,可以轻松绘制战术图和战场布局,帮助你与队友默契配合,制

MiniGPT-4:用高级大型语言模型增强视觉-语言理解

文章目录摘要1、简介2、相关工作3、方法3.1、第一个预训练阶段3.2、策划高质量的视觉语言域对齐数据集。3.3、第二阶段微调4、演示:5、局限性摘要论文链接:https://arxiv.org/pdf/2304.10592v1.pdf最近的GPT-4展示了非凡的多模态能力,例如从手写文本直接生成网站和识别图像中的幽默

JS 手写call、apply和bind方法

手写call、apply和bind方法一、方法介绍1.1call方法1.2apply方法1.3bind二、方法的实现2.1call方法2.2apply方法2.3bind方法一、方法介绍apply、call和bind都是系统提供给我们的内置方法,每个函数都可以使用这三种方法,是因为apply、call和bind都实现在了

软件设计模式系列之十一——装饰模式

当谈到设计软件系统时,经常需要考虑如何使系统更加灵活、可扩展和易维护。设计模式是一种被广泛采用的方法,用于解决常见的设计问题,并提供了一套可重用的解决方案。装饰模式(DecoratorPattern)是一种结构型设计模式,它允许您在不改变对象接口的情况下动态地添加对象的功能或责任。在本文中,我们将深入探讨装饰模式,包括

ChatGLM P-Tuningv2微调定制AI大模型

前言什么是模型微调想象一下,你正在学习如何弹奏一首钢琴曲目。你已经学会了一些基本的钢琴技巧,但你想要更进一步,尝试演奏一首特定的曲目。这时,你会选择一首你感兴趣的曲目,并开始深度练习。Fine-tuning(微调)在机器学习中也是类似的概念。当我们使用预先训练好的模型(预训练Pre-training)来解决一个特定的任

【uniapp】小程序开发:2 安装uni-ui组件库、使用pinia状态管理、自定义http请求

一、安装uni-ui组件库1、安装pnpmi-Dsasspnpmi@dcloudio/uni-ui2、配置组件自动导入使用npm安装好uni-ui之后,需要配置easycom规则,让npm安装的组件支持easycom打开项目根目录下的pages.json并添加easycom节点://pages.json{"easyco

Remix v2 + Cloudflare Pages 集成 Github 登录

RemixAuth特性完整的服务器端身份验证完整的TypeScript支持基于策略的身份验证轻松处理成功和失败实施自定义策略支持持久会话文章目录RemixAuth特性安装依赖封装服务登录及回调登出/注销TypeScript类型FAQ安装依赖npmi--saveremix-authremix-auth-github需要用

【ArcGIS】基本概念-矢量空间分析

栅格数据与矢量数据1.1栅格数据栅格图是一个规则的阵列,包含着一定数量的像元或者栅格常用的栅格图格式有:tif,png,jpeg/jpg等1.2矢量数据矢量图是由一组描述点、线、面,以及它们的色彩、位置的数据,通过软件算法计算得到的图形。常用的矢量图格式有:shp、eps、dwg、dxf等GIS中矢量数据可以分为地图层

热文推荐