当前位置: 首页 > news >正文

【链表OJ 11】复制带随机指针的链表

前言: 

💥🎈个人主页:​​​​​​Dream_Chaser~ 🎈💥

✨✨刷题专栏:http://t.csdn.cn/UlvTc

⛳⛳本篇内容:力扣上链表OJ题目

目录

leetcode138. 复制带随机指针的链表

1. 问题描述

2.代码思路:

2.1拷贝节点插入到原节点的后面

2.2控制拷贝节点的random    

2.3拷贝节点解下来尾插组成拷贝链表,恢复原链表


leetcode138. 复制带随机指针的链表

来源:138. 复制带随机指针的链表 - 力扣(LeetCode)

1. 问题描述

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。

构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不

应指向原链表中的节点 

例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。

返回复制链表的头节点。

题解接口: 

struct Node* copyRandomList(struct Node* head) {}

2.代码思路:

2.1拷贝节点插入到原节点的后面

        复制节点:遍历原链表,对于每个节点,创建一个副本节点,并将其插入到原节点的后面。

我们一步一步分解来做,首先malloc一个新的节点,然后让copy指针接收,让原链表第一个节点里面的val值赋值给新malloc出来的链表。

        最后记得将cur=next,让cur指向next,循环条件是cur不为NULL,再次回到循环,重复①②③④⑤⑥⑦的步骤

        这是链表的最后情况。 

2.2控制拷贝节点的random    

  • 设置random指针:遍历链表,对于每个原节点,设置对应副本节点的random指针。
  1. 如果原节点的random指针为NULL,则副本节点的random指针也设置为NULL
  2. 否则,副本节点的random指针设置为原节点的random指针指向的节点的副本节点。

分解动作:

①把cur指针重新指向原链表头节点(head

②进入while循环,条件是cur不为NULL,定义一个新指针copy然后让其指向新组成的链表头节点的下一个节点cur->next      

③     如果原链表的random域指向的地址为NULL,那么新节点的random域指向NULL

         如果原链表的random域指向的地址不为NULL,那么此时将此时cur->random->next的地址赋值给新节点的copy->random

④将copy->next赋值给cur

循环①②③④步,结束条件是cur指向NULL

这是最终情况.

2.3拷贝节点解下来尾插组成拷贝链表,恢复原链表

        分离链表:遍历合并后的链表,将链表分离为原链表副本链表。同时,恢复原链表的next指针,使其指向原链表的下一个节点;同时,构建副本链表,通过尾插法将副本节点依次添加到副本链表的末尾。

尾插:

恢复链表

         循环条件依然是cur不为NULL,当cur指向NULL,循环结束直接返回副本链表的头节点copyHead

代码实现:

struct Node* copyRandomList(struct Node* head) {//1.拷贝节点插入在原节点的后面struct Node* cur=head;while(cur){struct Node* copy=(struct Node*)malloc(sizeof(struct Node));copy->val=cur->val;struct Node* next= cur->next;//插入cur->next=copy;copy->next=next;cur=next;}//2.控制拷贝节点的randomcur=head;while(cur){struct Node* copy=cur->next;if(cur->random == NULL){copy->random=NULL;}else{copy->random=cur->random->next;}cur= copy->next;}// 3、拷贝节点解下来尾插组成拷贝链表,恢复原链表struct Node*copyHead =NULL,*copyTail=NULL;cur=head;while(cur){struct Node* copy=cur->next;struct Node* next=copy->next;//尾插if(copyTail == NULL){copyHead= copyTail=copy;}else{copyTail->next=copy;copyTail=copyTail->next;}//恢复原链表cur->next=next;cur= next;}return copyHead;
}

执行:

        文章讲解到此结束,如有错误,欢迎指正 感谢支持!

相关文章:

【链表OJ 11】复制带随机指针的链表

前言: 💥🎈个人主页:​​​​​​Dream_Chaser~ 🎈💥 ✨✨刷题专栏:http://t.csdn.cn/UlvTc ⛳⛳本篇内容:力扣上链表OJ题目 目录 leetcode138. 复制带随机指针的链表 1. 问题描述 2.代码思路: 2.1拷贝节点插入到…...

Jenkins自动构建(Gitee)

Gitee简介安装JenkinsCLI https://blog.csdn.net/tongxin_tongmeng/article/details/132632743 安装Gitee jenkins-cli install-plugin gitee:1.2.7 # https://plugins.jenkins.io/gitee/releases获取安装命令(稍作变更) JenkinsURL Dashboard-->配置-->Jenkins Locatio…...

nginx离线安装

ngixn的离线安装(centos7) 需要的依赖 gcc、gcc-c pcre-8.42.tar.gz zlib-1.2.11.tar.gz openssl-1.1.1s.tar.gz perl-5.28.0.tar.gz 在进行nginx离线安装时,首先查看系统是否安装 gcc、gcc-c,若没有进行安装,请先进行安装 gcc -v #查…...

Oracle Merge Into ORA-00001: unique constaint violated问题

最近使用Datax同步进行定时数据同步,并在同步完之后进行回调sql进行统计操作。对应的ORACLE表结构如下: create table DATA_STAT_DAY ( DATA_DATE DATE, ID VARCHAR2(2), NAME VARCHAR2(2), CLASSNO VARCHAR2(2), SCORES NUMBER(16,0) );CREATE UNIQU…...

javaScript:DOM中的CSS操作

目录 1.style 属性获取元素写在行间的样式 2.getComputedStyle(元素对象,null)可以获取元素的非行间样式 3.案例(定义一个div和按钮,每点击一次按钮div宽度增加) 效果预览图 代码实现 在 JavaScript 中,可以通过…...

2023最新UI工作室官网个人主页源码/背景音乐/随机壁纸/一言

2023最新UI工作室官网个人主页源码/支持背景音乐/随机壁纸/一言 功能介绍: 载入动画 站点简介 Hitokoto 一言 日期及时间 实时天气 时光进度条 音乐播放器 移动端适配 打开文件;index.html和setting.json修改替换你的相关信息&a…...

常用命令之mysql命令之show命令

一、mysql show命令简介 mysql数据库中show命令是一个非常实用的命令,SHOW命令用于显示MySQL数据库中的信息。它可以用于显示数据库、表、列、索引和用户等各种对象的信息。我们常用的有show databases,show tables,show full processlist等&…...

iOS接入IJKPlayer遇到的问题汇总

这里有一个我自己编译的IJKMediaFramework,能解决目前Github上反馈很多常见的IJKPlayer使用问题(包含播放异常,UI主线程Crash等),替换自己项目中的IJKMediaFramework即可链接: https://pan.baidu.com/s/1UO-YfN_1YIDOX81bgW8bag?pwdvq4u 提取…...

【LeetCode题目详解】第八章 贪心算法 part06 738.单调递增的数字 968.监控二叉树 (day37补)

本文章代码以c为例&#xff01; 一、力扣第738题&#xff1a;单调递增的数字 题目&#xff1a; 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数…...

代码随想录算法训练营Day48 | 198.打家劫舍,213.打家劫舍II,337.打家劫舍III | Day 20 复习

198.打家劫舍 文章链接 | 题目链接 | 视频链接 C解法 class Solution { public:int rob(vector<int>& nums) {vector<int> dp (nums.size(), 0);if (nums.size() 0){return 0;}if (nums.size() 1){return nums[0];}dp[0] nums[0];dp[1] max(nums[0]…...

Spring Boot @Validated 和Javax的@Valid配合使用

一、Validated 和Valid有什么用 Validation 和Valid 常常配合使用对传输的参数进行数据校验的注解&#xff0c;并通过配置全局异常处理器进行合理化的提示&#xff0c;增加用户的体验 并且Validated可以通过分组来指定什么时候触发什么样的参数校验&#xff08;这里看一下就行…...

论文复现--lightweight-human-pose-estimation-3d-demo.pytorch(单视角多人3D实时动作捕捉DEMO)

分类&#xff1a;动作捕捉 github地址&#xff1a;https://github.com/Daniil-Osokin/lightweight-human-pose-estimation-3d-demo.pytorch 所需环境&#xff1a; Windows10&#xff0c;conda 4.13.0&#xff1b; 目录 conda环境配置安装Pytorch全家桶安装TensorRT&#xff08;…...

在Windows下设置将EXE开机自启动

在Windows下设置将EXE开机自启动&#xff0c;有多种方法。以下是两种常用的方法&#xff1a; 方法一&#xff1a;通过注册表 打开“运行”&#xff08;快捷键&#xff1a;Win R&#xff09;&#xff0c;输入&#xff1a;reg add HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windo…...

反序列化漏洞及漏洞复现

文章目录 渗透测试漏洞原理不安全的反序列化1. 序列化与反序列化1.1 引例1.2 序列化实例1.2.1 定义一个类1.2.2 创建对象1.2.3 反序列化1.2.4 对象注入 2. 漏洞何在2.1 漏洞触发 3. 反序列化漏洞攻防3.1 PHP反序列化实例3.1.1 漏洞利用脚本3.1.2 漏洞利用3.1.3 获取GetShell 3.…...

软件工程笔记001

2023年9月5日&#xff0c;周二上午 软件工程的目标 软件工程的目标是成功地开发一个软件&#xff1a; 较低的开发成本能按时交付软件开发出来的软件该有的功能都有开发出来的软件运行效率高开发出来的软件可靠性高开发出来的软件易于维护 软件的生存周期 概念 软件生存周期…...

java进行系统的限流实现--Guava RateLimiter、简单计数、滑窗计数、信号量、令牌桶

本文主要介绍了几种限流方法&#xff1a;Guava RateLimiter、简单计数、滑窗计数、信号量、令牌桶&#xff0c;漏桶算法和nginx限流等等 1、引入guava集成的工具 pom.xml 文件 <dependency><groupId>com.google.guava</groupId><artifactId>guava<…...

《86盒应用于家居中控》——实现智能家居的灵动掌控

近年来&#xff0c;智能家居产品受到越来越多消费者的关注&#xff0c;其便捷、舒适的生活方式让人们对未来生活充满期待。作为智能家居方案领域的方案商&#xff0c;启明智显生产设计的86盒凭借出色的性能和良好的用户体验&#xff0c;成功应用于家居中控系统&#xff0c;让家…...

【LeetCode】328. 奇偶链表

328. 奇偶链表&#xff08;中等&#xff09; 思路 如果链表为空&#xff0c;则直接返回链表。 对于原始链表&#xff0c;每个节点都是奇数节点或偶数节点。头节点是奇数节点&#xff0c;头节点的后一个节点是偶数节点&#xff0c;相邻节点的奇偶性不同。因此可以将奇数节点和偶…...

数字城市:科技革命下的未来之城

随着科技的不断进步&#xff0c;数字城市已经成为了未来城市发展的关键趋势。数字城市是指利用先进的信息技术、互联网和大数据等工具&#xff0c;将城市各个方面进行数字化、智能化、互联化的发展模式。它不仅仅是一种技术&#xff0c;更是一种对城市管理、发展和居民生活方式…...

Qt鼠标点击事件处理:按Escape键退出程序

创建项目 Qt 入门实战教程&#xff08;目录&#xff09; 首先&#xff0c;创建一个名称为QtKeyEscape的Qt默认的窗口程序。 参考 &#xff1a;Qt Creator 创建 Qt 默认窗口程序 Qt响应键盘Escape事件 打开Qt Creator >>编辑 >> 项目 >> Headers>> …...

穿越机老鸟踩坑实录:MPU6000传感器在F4飞控上的IMU方向“玄学”配置

穿越机IMU方向配置实战&#xff1a;从MPU6000异常自旋到飞控底层校准 当你的穿越机在通电瞬间像被无形大手狠狠抽了一记耳光般疯狂自旋&#xff0c;而Betaflight地面站里陀螺仪数据却显示"一切正常"时&#xff0c;这往往意味着你正遭遇IMU方向配置的"量子纠缠态…...

STM32F407通过SPI接口高效读写SD卡:CubeMX配置与底层驱动实战

1. SD卡基础与SPI通信原理 SD卡作为嵌入式系统中最常用的存储介质之一&#xff0c;其SPI模式因其接线简单、协议清晰而广受欢迎。先说说我实际项目中遇到的坑&#xff1a;曾经因为没理解清楚SPI模式下SD卡的初始化时序&#xff0c;导致整整两天卡在设备无法识别的困境里。 SD卡…...

深度集成AI的VSCode扩展:从代码生成到调试的全流程实战指南

1. 项目概述&#xff1a;一个为VSCode注入AI灵魂的扩展如果你和我一样&#xff0c;每天有超过8小时的时间是在Visual Studio Code&#xff08;VSCode&#xff09;里度过的&#xff0c;那么你一定对提升编码效率有着近乎偏执的追求。从代码补全、语法高亮到调试、版本控制&#…...

从零到一:基于HappyBase的HBase Python应用实战指南

1. 环境准备与基础配置 第一次接触HBase和HappyBase时&#xff0c;环境配置往往是最让人头疼的部分。记得我刚开始搭建环境时&#xff0c;花了整整两天时间才把所有服务调通。为了让各位少走弯路&#xff0c;我把这些年积累的经验都整理在这里。 首先需要明确的是&#xff0c…...

技术视角:Sketchfab数据提取工具深度解析3D模型下载机制

技术视角&#xff1a;Sketchfab数据提取工具深度解析3D模型下载机制 【免费下载链接】sketchfab sketchfab download userscipt for Tampermonkey by firefox only 项目地址: https://gitcode.com/gh_mirrors/sk/sketchfab 在WebGL技术日益成熟的今天&#xff0c;Sketch…...

VectorDBBench:向量数据库性能基准测试工具详解与实战

1. 项目概述&#xff1a;向量数据库性能测试的“瑞士军刀”如果你正在评估或使用向量数据库&#xff0c;那么你一定遇到过这个灵魂拷问&#xff1a;“这么多产品&#xff0c;到底哪个最适合我的场景&#xff1f;”是选名声在外的老牌劲旅&#xff0c;还是选后起之秀的专精选手&…...

Bifrost:轻量高效的实时数据同步平台架构与实战

1. 项目概述&#xff1a;Bifrost&#xff0c;一个被低估的现代数据同步利器如果你正在处理跨数据库、跨数据源的数据同步任务&#xff0c;并且对传统ETL工具的笨重、配置复杂感到头疼&#xff0c;那么maximhq/bifrost这个项目绝对值得你花时间深入了解。我第一次接触Bifrost是在…...

Qwen2.5-14B实战指南:3个关键步骤突破本地大模型部署瓶颈

Qwen2.5-14B实战指南&#xff1a;3个关键步骤突破本地大模型部署瓶颈 【免费下载链接】Qwen2.5-14B 项目地址: https://ai.gitcode.com/hf_mirrors/ai-gitcode/Qwen2.5-14B 当开发者面对复杂的代码生成任务或技术文档分析需求时&#xff0c;往往会受限于云端API的延迟和…...

轻量级Web框架Oli:从核心原理到生产实践

1. 项目概述&#xff1a;一个轻量级、可扩展的Web应用框架最近在梳理手头几个小项目的技术栈时&#xff0c;我又把amrit110/oli这个仓库翻了出来。这是一个在GitHub上由开发者amrit110创建并维护的名为oli的项目。乍一看标题&#xff0c;你可能会有点懵&#xff0c;oli是什么&a…...

Python邮件自动化实战:基于mymailclaw的监控报警与Slack集成

1. 项目概述与核心价值最近在折腾邮件自动化处理的时候&#xff0c;发现了一个挺有意思的开源项目&#xff0c;叫psandis/mymailclaw。乍一看这个名字&#xff0c;你可能会联想到“邮件抓取”或者“邮件爬虫”。没错&#xff0c;它的核心定位就是一个用 Python 写的邮件客户端自…...