【链表经典面试题】LeetCode138.复制带随机指针的链表(链表深拷贝)

news2024/10/6 1:41:48

📇文章目录

  • 🚀题目描述
  • 🚀思路1:
  • 🚀思路2:
  • 🚀完整代码

🚀题目描述

在这里插入图片描述
在这里插入图片描述

解读: 题目意思就是 给你一个链表 这个链表中除了有next指针之外 还有一个指向这个链表的随机位置的一个指针,让你复制这一个链表
而你复制之后的这个链表中的每一个节点的随机指针,也应该像原链表一样指向对应的节点

这里容易有一个误区,就是把拷贝之后的节点的随机指针random 置成原链表的random,这是不对的,因为他的意思是相当于让你把链表的结构也复制过来
比如说
原链表是7->13->11>10->1 ,其中13的random指向的是原链表中的7
那么你拷贝之后的链表也是 7->13->11->10->1 并且13指向拷贝之后的链表中的7

那么具体怎么做呢?
主要难搞的就是这个random 

🚀思路1:

7->13->11->10->1这个链表为例
复制之后我的13节点的random应该指向7 那么我遍历一遍去找值为7的节点不就可以了吗?
但是我们要想一想
如果这个链表是 7->7->13->11->10>1呢?
有两个节点的值都是7 ,那么返回哪一个呢? 是不是就不行了!
而且在效率方面最坏的情况,每一个节点都需要遍历一遍
时间复杂度是O(N^2)
所以这是一种错误思路!(怕就怕他有不止一个相同的值)

🚀思路2:

(想不到就没法做!!),技巧性很强,所以先看步骤

  1. 每一个拷贝的节点都直接链接在原节点的后面,形成一个大链表(考察链表节点的插入)在这里插入图片描述

  2. 然后通过原节点的random去找拷贝节点的random
    复制节点的random 就等于 原节点的randomnext(考察逻辑)
    如图分析在这里插入图片描述

    分析:拷贝链表中的random肯定和原链表中的random是有关系的,那么关系是什么呢?
    拷贝链表中的random一定指向了拷贝链表中的某一个节点
    这个节点怎么找呢?
    这就需要借助原链表
    因为我们把原链表和拷贝链表已经连接起来了,并且每一个拷贝节点是原链表的相同节点的next
    我们还是拿13这个节点为例,看上图
    原链表13的random指向的位置 的下一个就是与原链表13的random指向的节点的拷贝(注意理解这句话!!)
    之所以这么做是因为:拷贝链表的random要指向自己所在的链表的节点!
    所以 拷贝节点的random就是 原节点的random指向的next
    如果currandom为空,那么拷贝链表的random也为空

3.合并之后的链表拆分下来(考察链表的删除和尾插)
如图:在这里插入图片描述
也就是重新遍历一遍合并后的大链表
cur指向原链表,每一次循环 都定义一个copy节点等于curnext
把copy节点尾插到新的头 并把原链表中的相邻节点连接起来(相当于删除pos位置然后链接前后节点)

🚀完整代码

/**
 * Definition for a Node.
 * struct Node {
 *     int val;
 *     struct Node *next;
 *     struct Node *random;
 * };
 */

struct Node* copyRandomList(struct Node* head) {
    struct Node* cur=head;
    //1. 拷贝原链表的值 并且链接原链表
    while(cur)
    {
        //每一次都malloc一个新节点出来,把新节点和原链表连接起来
        struct Node* copy=(struct Node*)malloc(sizeof(struct Node));
        struct Node* next=cur->next;
        //copy的值 是cur的值
        copy->val=cur->val;
        //然后链接 cur copy next
        cur->next=copy;
        copy->next=next;
        //然后让cur向后走
        cur=next;

    }


    //2. 然后拷贝random指针
    
    cur=head;//让cur重新指向head
    while(cur)
    {
        //因为已经链接上了原链表
        // 所以每一次进来可以利用cur找到copy
        struct Node* copy=cur->next;
        if(cur->random==NULL)
        {
            copy->random=NULL;;
        }
        else
        {
            copy->random=cur->random->next;
        }
        //然后更新cur
        cur=copy->next;
    }

    //3. 把原链表和拷贝链表分离开
    cur=head;
    struct Node* copyNhead=NULL,*copyTail=NULL;
    while(cur)
    {
        //每一次找到我的拷贝链表
        struct Node*copy=cur->next;
        // 拷贝链表的下一个(用于恢复原链表(链接原链表的两个节点))
        struct Node*next=copy->next;
        //如果新链表尾为空 那么就头插
        if(copyTail==NULL)
        {
            copyTail=copyNhead=copy;
        }
        else
        {
            // 如果拆出来的拷贝链表不为空 
            // 那么 tail的next赋值为copy
            // 然后 更新尾
            copyTail->next=copy;
            copyTail=copy;

        }
        // 然后cur向后走
        cur->next=next;//这是恢复原链表
        cur=next;
    }
    return copyNhead;

}

在这里插入图片描述
     感谢阅读哦 给个赞把~~😛

在这里插入图片描述

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

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

相关文章

在哪里可以查到一手的标讯信息?

标讯信息集招投标讯息的简称。在市场上,标讯是一种非常关键的信息,包括招标公告,文件,截止日期等关键内容,便于需求方和供应商进行业务合作。 对于企业来说,及时获取到最新的标讯信息是非常重要的&#xf…

安装VS Code 提示This User Installer is not meant to be run as an Administrator问题

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 在vs code官网(https://code.visualstudio.com/)下载安装包,显示如下提示信息: This User Installer is not meant to be run as an Administrator.…

【vue大作业-端午节主题网站】【预览展示视频和详细文档】

vue大作业-端午节主题网站介绍 端午节,又称为龙舟节,是中国的传统节日之一,每年农历五月初五庆祝。这个节日不仅是纪念古代爱国诗人屈原的日子,也是家人团聚、共享美食的时刻。今天,我们非常高兴地分享一个以端午节为…

【字符串解析】IP地址字段解析提取函数接口

在嵌入式业务逻辑中,我们有时需要从配置文件、串口或者服务端接收的消息数据中进行字符串解析,来提取需要的目标字符串字段。通常我们会调用字符串处理相关的函数,例如strstr,strchr,sscanf等,再结合指针偏…

【验证码识别】Yolov8实战某验3空间推理点选验证码,目标检测,语义分割,颜色分类。

【验证码识别】Yolov8实战某验3空间推理点选验证码,目标检测,语义分割,颜色分类。 文章目录 【验证码识别】Yolov8实战某验3空间推理点选验证码,目标检测,语义分割,颜色分类。声明1.空间推理验证码&#xf…

C# OpenCvSharp 车牌颜色识别

C# OpenCvSharp 车牌颜色识别 目录 效果 项目 代码 下载 效果 项目 代码 using OpenCvSharp; using System; using System.Diagnostics; using System.Drawing; using System.Windows.Forms; namespace OpenCvSharp_Demo { public partial class Form1 : Form { …

采购芯片时细心,再细心!

检查原理图,采购时候的细心对照所费的时远远少于焊完找BUG的时间!!! 购买芯片的时候不光看芯片名称,封装,丝印也要看,如果不一样必须对照两者的引脚图仔细观察是否一样!&#xff01…

扭蛋机小程序:深度探索虚拟寻宝之旅的乐趣

引言 扭蛋机小程序,这个融合了传统与创新的虚拟寻宝乐园,已经吸引了无数玩家的目光。在这个充满惊喜和挑战的虚拟世界里,每一个扭蛋都可能蕴藏着无尽的宝藏。本文将带您深入探索扭蛋机小程序的魅力所在,体验一场别开生面的虚拟寻…

上位机图像处理和嵌入式模块部署(h750 mcu vs f407)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 在目前工业控制上面,f103和f407是用的最多的两种stm32 mcu。前者频率低一点,功能少一点,一般用在低端的嵌入式设…

【数据结构与算法】运算受限的线性表(栈,队列)重要知识点详解

栈和队列是什么样的线性表? 栈(Stack)和队列(Queue)都是运算受限的线性表。 栈:栈是一种特殊的线性表,只允许在一端(通常称为“顶端”)进行插入和删除操作。栈遵循后进先出&#x…

CENTOS7.9下服务器双网卡bond模式6配置示例

​1.bond口的特点 bond口通过将多个网口进行聚合,多个网口聚合后一方面实现了大带宽传输,另外多网口聚合后也同时具有冗余特性,当其中一个网口down掉后,其他网口会继续转发流量,不会导致流量中断。 2.使用条件 当环境…

参数搜索流形学习

目录 一、网格搜索1、介绍2、代码示例 二、HalvingGridSearch1、介绍2、代码示例 三、随机搜索1、介绍2、代码示例 三、贝叶斯搜索1、介绍2、代码示例 四、参数搜索总结五、流形学习1、LLE1、介绍2、官方代码示例 2、t-SNE1、介绍2、官方代码示例 一、网格搜索 1、介绍 网格搜…

安卓手机最近删除照片如何找回?这些技巧来帮你!

我们时常会在手机上拍摄大量照片,记录下生活中的每一个瞬间。然而,由于存储空间不足、设备更新等原因,我们可能会不小心删除一些照片。最近删除照片如何找回?通过本文的介绍,您将了解到如何轻松找回最近删除的照片&…

2025计算机毕业设计选题题目推荐-毕设题目汇总大全

选题在于精,以下是推荐的容易答辩的选题: SpringBoot Vue选题: 基于SpringBoot Vue家政服务系统 基于SpringBoot Vue非物质文化遗产数字化传承 基于SpringBoot Vue兽医站管理系统 基于SpringBoot Vue毕业设计选题管理系统 基于SpringBoot Vue灾害应急救援…

群辉USB Copy套件的使用

目录 一、套件安装 二、插入USB设备 三、使用 四、故障排除 有了群辉NAS后,很多U盘、移动硬盘的数据需要备份到NAS中,这时就可以考虑使用USB Copy这个套件了。 USB Copy 乃是群晖上可用于和外接存储设备进行文件复制的一个工具,我常常借助它把外置存储设备的文件拷贝至…

程序猿大战Python——文件操作、异常、模块——异常介绍

什么是异常 目标:了解什么是异常? 异常指的是Python程序发生的不正常事件。 有时候,异常可称为错误。 当检测到一个错误时,Python解释器就无法继续执行,反而出现了一些错误的提示,这就是异常,…

stable diffusion-v2.1-pytorch以文生图推理模型

Stable Diffusion Version 2 论文 DENOISING DIFFUSION IMPLICIT MODELS https://arxiv.org/pdf/2010.02502 模型结构 通过串联或更通用的交叉注意机制来调节LDM 算法原理 通过将图像形成过程分解为去噪自动编码器的顺序应用,扩散模型(DM&#xff…

Thermo Fisher赛默飞TSQ单杆电源维修1R120380-0001

美国热电质朴分析仪电路板维修,液相色谱质谱联用仪维修,Thermo Fisher赛默飞世尔光谱仪IS10 IS5赛默飞主板维修。 公司仪器维修设备备有三相交流电源,变频电源,无油空压气源,标准化的维修平台、电子负载,耐压测试仪、老…

【YOLOv8改进[注意力]】使用MLCA混合局部通道注意力改进c2f + 含全部代码和详细修改方式 + 手撕结构图

本文将进行在YOLOv8中使用MLCA混合局部通道注意力改进c2f 的实践,助力YOLOv8目标检测效果的实践,文中含全部代码、详细修改方式以及手撕结构图。助您轻松理解改进的方法。 改进前和改进后的参数对比: 目录 一 MLCA 二 使用MLCA混合局部通道注意力改进c2f 1 整体修改

群辉NAS映射为本地盘符

目录 一、本地通过网上邻居 二、远程使用WebDAV套件 1、NAS安装套件 2、使用ZeroTier (1)NAS上安装ZeroTier (2)PC上安装ZeroTier (3)PC上安装RaiDrive并设置 3、使用cpolar (1)NAS安装cpolar (2)配置WebDAV (3)配置cpolar (4)PC上安装并配置RaiDrive…