【LeetCode】数据结构题解(9)[复制带随机指针的链表]

news2024/11/26 7:29:48

复制带随机指针的链表

  • 😉 1.题目来源
  • 👀2.题目描述
  • 🤔3.解题思路
  • 🥳4.代码展示

在这里插入图片描述

所属专栏:玩转数据结构题型❤️
🚀 >博主首页:初阳785❤️
🚀 >代码托管:chuyang785❤️
🚀 >感谢大家的支持,您的点赞和关注是对我最大的支持!!!❤️
🚀 >博主也会更加的努力,创作出更优质的博文!!❤️
🚀 >关注我,关注我,关注我,重要的事情说三遍!!!!!!!!❤️

😉 1.题目来源

LeetCode:复制带随机指针的链表

👀2.题目描述

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

在这里插入图片描述

🤔3.解题思路

  • 我们分析一下题目的要求:复制一个长度为n的链表,其中节点里面包含了一个val值和一个random随机指针,这个指针可指向链表中的任意一个节点包括了NULL。
  • 如果题目只是要求复制一个长度为n的链表,并且复制val值的话就简单的多了。直接遍历原链表,把值都一一复制过来就行了。但是题目多加了一个条件,就是random值。复制节点的值很简单,😔但是random是一个指向节点的指针,当我们复制链表的时候,我们新的链表节点的地址肯定是与原链表节点的地址是不一样的,即使遍历了原链表的random值也找不到新链表的random值,🙅 所以找到random值是一个难点。
  • 那既然这样我们便可以创建一个长度为n+1的整形数组,用来记录每个节点距离头节点的距离包括了NULL。这样的话我们就可以先遍历原链表,把每个节点random所指向的值计入到数组当中,然后复制链表的时候,🤩根据这个数组来找到random指向的值。这固然是一种方法,但是他的 空间复杂度:O(n)时间复杂度:O(n^2),并不是一个好的解题方法。
  • 🤔那怎么才可以在遍历原数组的过程中就可以确定复制链表的random值呢?那我们就可以从原链表出发。🤯于是我们就想到了,如果我们把每个要复制的节点都插入到被复制节点的后面(也就是每个原节点的后面)这样的话,就很好的解决了找random值这一问题。我们原节点->random->next == 复制节点->random。

在这里插入图片描述

  • 完成复制与以及给random赋值完后,就可以把复制节点断开,一一链接成链表,并且恢复原链表
    在这里插入图片描述

🥳4.代码展示

struct Node* copyRandomList(struct Node* head) 
{

    //第一步,把每个拷贝节点链接到原节点出
    struct Node* cur = head;
    while (cur)
    {
        struct Node* Next = cur->next;
        //开辟赋值节点
        struct Node* copyNode = (struct Node*)malloc(sizeof(struct Node));
        //给节点拷贝val值
        copyNode->val = cur->val;
        cur->next = copyNode;
        copyNode->next = Next;
        cur = Next;
    }
    //第二步,给random赋值
    cur = head;
    while (cur)
    {
        struct Node* copyNode = cur->next;
        if (cur->random == NULL)
        {
            copyNode->random = NULL;
        }
        else
        {
            copyNode->random = cur->random->next;
        }
        cur = copyNode->next;
    }
    //第三步,链接赋值链表,并恢复原链表
    cur = head;
    struct Node* copyhead = NULL, *copyCur = NULL;
    while (cur)
    {
        struct Node* copy = cur->next;
        struct Node* Next = copy->next;

        if (copyhead == NULL)
        {
            copyhead = copyCur = copy;
        }
        else
        {
            copyCur->next = copy;
            copyCur = copyCur->next;
        }
        cur->next = Next;
        cur = Next;
    }

    return copyhead;

}

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

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

相关文章

使用Pytest集成Allure生成漂亮的图形测试报告

目录 前言 依赖包安装 Pytest Allure Pytest Adaptor 改造基于Pytest的测试用例 生成测试报告 运行测试 生成测试报告 打开测试报告 资料获取方法 前言 之前写过一篇生成测试报告的博客,但是其实Allure首先是一个可以独立运行的测试报告生成框架&#xff…

(杭电多校)2023“钉耙编程”中国大学生算法设计超级联赛(6)

1001 Count 当k在区间(1n)/2的左边时,如图,[1,k]和[n-k1,n]完全相同,所以就m^(n-k) 当k在区间(1n)/2的右边时,如图,[1,n-k1]和[k,n]完全相同,所以也是m^(n-k) 别忘了特判,当k等于n时,n-k为0,然后a1a1,a2a2,..anan,所以没什么限制,那么就是m^n AC代码: #includ…

Vue3 大屏数字滚动效果

父组件&#xff1a; <template> <div class"homePage"> <NumRoll v-for"(v, i) in numberList" :key"i" :number"v"></NumRoll> </div> </template> <script setup> import { onMounted, r…

【Vue3】动态组件

动态组件的基本使用 动态组件&#xff08;Dynamic Components&#xff09;是一种在 Vue 中根据条件或用户输入来动态渲染不同组件的技术。 在 Vue 中使用动态组件&#xff0c;可以使用 元素&#xff0c;并通过 is 特性绑定一个组件的名称或组件对象。通过在父组件中改变 is 特…

C++ 虚析构函数

在C中&#xff0c;不能声明虚构造函数&#xff0c;但是可以声明虚析构函数。 析构函数没有类型&#xff0c;也没有参数&#xff0c;和普通成员函数相比&#xff0c;虚析构函数情况很简单。 虚析构函数的声明语法&#xff1a; virtual ~类名();如果一个类的析构函数是虚函数&…

Python自动化测试用例:如何优雅的完成Json格式数据断言

目录 前言 直接使用 优化 封装 小结 进阶 总结 资料获取方法 前言 记录Json断言在工作中的应用进阶。 直接使用 很早以前写过一篇博客&#xff0c;记录当时获取一个多级json中指定key的数据&#xff1a; #! /usr/bin/python # coding:utf-8 """ aut…

森海塞尔为 CUPRA 首款纯电轿跑 SUV – CUPRA Tavascan 注入音频魅力

森海塞尔为 CUPRA 首款纯电轿跑 SUV – CUPRA Tavascan 注入音频魅力 音频专家森海塞尔携手富有挑战精神的 CUPRA&#xff0c;雕琢时代新贵车型&#xff0c;打造畅快尽兴的驾驶体验 全球知名音频专家森海塞尔与以颠覆传统、充满激情、不甘现状而闻名的汽车品牌 CUPRA 展开合作…

awk案例练习

目录 一、awk练习 1.1筛选ip地址 1.2字段去重 1.3次数统计 1.4统计TCP连接状态 1.5处理字段缺失的数据 1.6筛选给定时间范围内的日志 一、awk练习 1.1筛选ip地址 ifconfig命令查看IP 利用awk进行筛选 ifconfig | awk BEGIN{RS""}NR2{print $6} RS指定输入记…

找工作的才是大爷?面试了一个工作4年的测试工程师,一问连自动化基础都不清楚,还反过来怼我....

我们公司也开始大量招人了&#xff0c;我这次是公司招聘的面试官之一&#xff0c;主要负责一些技术上的考核&#xff0c;这段时间还真让我碰到了不少奇葩求职者 昨天公司的HR小席刚跟我吐槽&#xff1a;这几个星期没有哪天不加班的&#xff01;各种招聘网站上的消息源源不断&a…

干货分享 | TSMaster图形模块功能详解(三)—— 以CAN信号为例

TSMaster图形模块功能详解第二章节中&#xff0c;我们主要分享了显示模式、图形设置、信号跳转与波形窗口移动、信号波形缩放4大模块的操作教程。 本章节在上一篇基础上&#xff0c;继续介绍TSMaster图形模块功能第11-15模块的教程。 本文目录&#xff1a; 11、适配 11.1 水平…

基于JavaWeb的家居电子商城管理系统

家居电子商城HOMEECMS 大二下的JavaWeb小学期课程写的一个家居电子商城管理系统&#xff0c;没有spring框架&#xff0c;纯servlet&#xff0c;线上家居电子商城系统&#xff0c;主要实现了用户注册&#xff0c;登录、浏览&#xff0c;查看家居商品信息&#xff0c;购物车&…

元宇宙3D数字虚拟客服打造年轻化、数字化营销新品牌

融合了元宇宙、AI和云计算等技术的虚拟数字人&#xff0c;成为元宇宙数字内容交互的载体&#xff0c;将现实世界中的人与虚拟数字世界的场景、模型及产品链接起来&#xff0c;特别是为电力企业打造的电力元宇宙平台&#xff0c;带来营销宣传多重好处的同时&#xff0c;树立了数…

什么?200?跨域?

情景复现 今天我遇到了一件很奇怪的事情就是&#xff0c;当我请求后端网关&#xff0c;然后通过网关去请求相应的服务&#xff0c;都进行了跨域处理 但是&#xff0c;奇怪的是我在请求的时候&#xff0c;回来的响应码是200&#xff0c;但是报错了&#xff0c;报的还是200的同…

基于微服务架构的智慧工地云平台系统源码

Spring Cloud 智慧工地源码&#xff0c;智慧建造源码 系统概述&#xff1a; 智慧工地云平台系统&#xff0c;依托计算机技术、物联网、云计算、大数据、人工智能、VR&AR等技术相结合&#xff0c;对建筑工地中的管理人员、施工人员、车辆/物料、施工设备、视频监控等数据有…

模仿火星科技 基于cesium+角度测量+高度测量+可编辑

1. 创建提示窗&#xff1a; 启动Cesium应用&#xff0c;地图场景将打开&#xff0c;欢迎您进入编辑模式。 在屏幕的一角&#xff0c;一个友好的提示窗将呈现&#xff0c;随着您的操作&#xff0c;它会为您提供有用的信息和指导。 2. 绘制面积&#xff1a; 轻轻点击鼠标左键&a…

华为OD机试真题 Java 实现【疫情扩散时间计算】【2023 B卷 200分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

【Python学习笔记】Matplotlib画图

Matplotlib画图 一、基本函数1. plt.plot2. plt.text3. 设置刻度4. 设置坐标5.设置网格 二、绘制折线图三、绘制散点图四、绘制柱状图五、绘制双坐标图 一、基本函数 1. plt.plot 参数功能选项color改变折线颜色‘r’,‘g’,‘b’,‘black’,‘gray’marker改变数据点的形状‘…

固态硬盘 vs 机械硬盘:选择合适的存储方案

随着计算机的快速发展&#xff0c;各种硬件组件如CPU、显卡以及制作工艺都取得了长足的进步&#xff0c;但是磁盘的发展相对较为缓慢&#xff0c;这也导致了磁盘性能在一定程度上限制了计算机的整体性能。为了解决这个问题&#xff0c;固态硬盘应运而生。 那么&#xff0c;我们…

(亲测)制作linux启动U盘

下载软碟通 https://cn.ultraiso.net/xiazai.html 点击文件中的打开&#xff0c;选中Linux系统 插入U盘&#xff0c;点击启动中的写入硬盘映像 点击之后会自动选中U盘。界面如下&#xff1a; 点击写入&#xff0c;点击后U盘会格式化&#xff0c;所以U盘里面有重要东西的话…

中国金融四十人论坛:2023年第二季度宏观政策报告(附下载)

关于报告的所有内容&#xff0c;公众【营销人星球】获取下载查看 核心观点 • 运行环境&#xff1a;外部环境方面&#xff0c;全球经济景气回落&#xff0c;会酸交作仍在收秀。内部环演方百&#xff0c;公共支出进一步旅爱&#xff0c;真交利本显考上开&#xff0c;社酸塔这创…