剑指offer——JZ35 复杂链表的复制 解题思路与具体代码【C++】

news2024/12/23 18:31:45

一、题目描述与要求

复杂链表的复制_牛客题霸_牛客网 (nowcoder.com)

题目描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)。 下图是一个含有5个结点的复杂链表。图中实线箭头表示next指针,虚线箭头表示random指针。为简单起见,指向null的指针没有画出。

示例:

输入:{1,2,3,4,5,3,5,#,2,#}

输出:{1,2,3,4,5,3,5,#,2,#}

解析:我们将链表分为两段,前半部分{1,2,3,4,5}为ListNode,后半部分{3,5,#,2,#}是随机指针域表示。

以上示例前半部分可以表示链表为的ListNode:1->2->3->4->5

后半部分,3,5,#,2,#分别的表示为

1的位置指向3,2的位置指向5,3的位置指向null,4的位置指向2,5的位置指向null

如下图:

示例

示例1:

输入:{1,2,3,4,5,3,5,#,2,#}

返回值:{1,2,3,4,5,3,5,#,2,#}


二、解题思路

根据题目描述我们需要自己创建新的链表并且将原来的链表的每个结点进行深拷贝到结点,也就是说我们新创建的结点不能够通过=p->random等来实现创建,而是需要创建自己的结点,并且使随机指针指向对应的新结点。

首先为了能够复制每一个结点,我们还是需要创建一个新的头结点。用来与新链表的第一个结点进行连接。此时还要分别定义两个指针,用来遍历新链表和旧链表。要实现结点的复制及其一一对应的关系,我们可以利用哈希表,令哈希表的key位原链表的结点,value即为新链表的结点,这样我们就可以实现新链表和旧链表一一对应的关系。

通过遍历原链表,我们利用new来创建新结点并且将对应原结点的值通过构造函数进行赋值,然后将新结点存入map表,接着就是在新链表实现连接。这一步完成就实现了新链表结点的创建与连接,但是random指针还没有实现。

接着我们就可以利用哈希表的特点,判断一下原结点的random指针指向,如果指向空,那就直接将对应新结点的random指针也指向空;如果不为空,那我们就需要知道原结点的random指针指向哪个结点,然后在map中找到对应的新结点赋值给新结点的random指针。

最后返回L->next即可。


三、具体代码

#include <unordered_map>
class Solution {
public:
    RandomListNode* Clone(RandomListNode* pHead) {
       if(pHead==nullptr) return pHead;
       RandomListNode* L=new RandomListNode(0);//新的头结点
       //哈希表,key为原始链表结点,value为拷贝链表的结点
       unordered_map<RandomListNode*, RandomListNode*> map;
       RandomListNode *cur=pHead;
       RandomListNode *pre=L;
       //遍历原始链表进行复制 同时实现next指针的指向
       while(cur){
          //拷贝结点
          RandomListNode *clone=new RandomListNode(cur->label);
          //用哈希表记录结点
          map[cur]=clone;
          //连接
          pre->next=clone;
          pre=pre->next;
          //遍历
          cur=cur->next;
       }
       //实现random指针指向
       for(auto node:map){
        if(node.first->random==nullptr){//原结点的随机指针指向空,则新结点也指向空
            node.second->random=nullptr;
        }
        else{//否则的话找到原节点random指针指向的结点对应的复制结点
            node.second->random=map[node.first->random];
        }
       }
       return L->next;
    }
};

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

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

相关文章

如何修改springboot项目启动时的默认图标?

如下所示为springboot项目启动时的默认图标&#xff0c;我们可以把它换成我们自己喜欢的图片 方法如下&#xff1a; 第一步&#xff1a;我们需要将图片放置当前项目的resources目录下 如下所示为我自定义的一张照片 第二步&#xff1a; 方法1:在application.properties文件中…

【数据结构】论如何拿捏快速排序?(含非递归)

目录 一&#xff0c;快速排序&#xff08;递归&#xff09; 1&#xff0c;快排思想 2&#xff0c;霍尔排序 3&#xff0c;挖坑法 4&#xff0c;前后指针法 5&#xff0c;快速排序优化 1&#xff0c;三数取中法选key 2&#xff0c;小区间优化 二&#xff0c;快速排序&a…

超大视频如何优雅切片

背景 有一次录屏产生了一个大小为33G的文件, 我想把他上传到B站, 但是B站最大只支持4G. 无法上传, 因此做了一个简单的探索. 质疑与思考 a. 有没有一个工具或一个程序协助我做分片呢? 尝试 a. 必剪 > 有大小限制, 添加素材加不进去(而且报错信息也提示的不对) b. PR &…

深入剖析红黑树:优雅地平衡二叉搜索树

目录 一.红黑树的概念二.插入操作三.与AVL树的比较 一.红黑树的概念 在之前的学习中&#xff0c;我们了解了二叉搜索平衡树&#xff0c;AVL树通过控制每个结点中的平衡因子的绝对值不超过1&#xff0c;实现了一个高性能的树。而相较于AVL的高度平衡&#xff0c;红黑树觉得AVL为…

Java 基于 SpringBoot+Vue 的留守儿童关爱网站

文章目录 1.研究背景2. 技术栈3.系统分析4系统设计5系统的详细设计与实现5.1系统功能模块5.2管理员功能模块 源码下载地址 1.研究背景 以往的留守儿童爱心的管理&#xff0c;一般都是纸质文件来管理留守儿童爱心信息&#xff0c;传统的管理方式已经无法满足现代人们的需求&…

《存储IO路径》-进程、线程和任务的区别

在Linux IO系统架构中&#xff0c;我们经常会听到进程、线程、任务、jbobs&#xff0c;QD&#xff0c;这些词汇常常会有一些模糊和混淆&#xff0c;本文我们主要对比下这几个概念的区别。 我们来看看这些术语在Linux IO路径中的角色&#xff1a; Process&#xff08;进程&…

基于STM32 ZigBee无线远程火灾报警监控系统物联网温度烟雾

实践制作DIY- GC00168---ZigBee无线远程监控系统 一、功能说明&#xff1a; 基于STM32单片机设计---ZigBee无线远程监控系统 二、功能说明&#xff1a; 1个主机&#xff1a;STM32F103C系列单片机LCD1602显示器蜂鸣器 ZigBee无线模块3个按键&#xff08;设置、加、减&#xff0…

计算机竞赛 题目:基于FP-Growth的新闻挖掘算法系统的设计与实现

文章目录 0 前言1 项目背景2 算法架构3 FP-Growth算法原理3.1 FP树3.2 算法过程3.3 算法实现3.3.1 构建FP树 3.4 从FP树中挖掘频繁项集 4 系统设计展示5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于FP-Growth的新闻挖掘算法系统的设计与实现…

Gallery2分析

本文分析的代码基于 Android 4.x 文章目录 Gallery2介绍基本数据数据源DataManager数据管理LocalSource本地数据源Media数据的加载过程Gallery2页面结构ActivityStateStateManagerGalleryAppImplAbstractGalleryActivityGalleryActivityAlbumSetPage数据加载和渲染过程分析第四…

Python操作MongoDb创建文档及CRUD基本操作

Python3中类的高级语法及实战 Python3(基础|高级)语法实战(|多线程|多进程|线程池|进程池技术)|多线程安全问题解决方案 Python3数据科学包系列(一):数据分析实战 Python3数据科学包系列(二):数据分析实战 Python3数据科学包系列(三):数据分析实战 MongoDB 操作手册----文档…

Access注入---偏移注入 | Mysql注入---DNS注入 | MSSQL---反弹注入

伪静态---假的静态页面判断页面是否为静态&#xff1a;document.lastModified偏移注入使用场景&#xff1a;遇到知道表明&#xff0c;但不知道字段名的情况下使用表.* >&#xff08;核心&#xff09;information_schema.tables&#xff08;去information_schema库里面选中ta…

头戴式耳机怎么戴好看?头戴式耳机正确代法

走在大街上总能看到那么一些人&#xff0c;他们眼神时而朦胧涣散&#xff0c;时而精神奕奕&#xff0c;全身上下始终散发着#请勿打扰#的气息&#xff0c;因为他们都戴着头&#xff01;戴&#xff01;式&#xff01;耳&#xff01;机&#xff01;但是头戴式耳机把头压得扁扁的&a…

UG\NX CAM二次开发 创建加工环境 UF_SETUP_create

文章作者:代工 来源网站:NX CAM二次开发专栏 简介: UG\NX CAM二次开发 创建加工环境 UF_SETUP_create,我们ug编程也是要进去加工模块加载环境,选择模板的这是我们加工编程的第一步 代码实现进入加工环境: void MyClass::do_it() { // 创建加工设置 UF_SETUP…

1300*D. Alice, Bob and Candies(模拟)

Problem - 1352D - Codeforces 解析&#xff1a; 模拟即可。 #include<bits/stdc.h> using namespace std; #define int long long const int N2e55; int t,n,a[N]; signed main(){scanf("%lld",&t);while(t--){scanf("%lld",&n);for(int i…

XPD977协议系列-支持 XPD-LINK™互联 USB 三端口控制器

XPD977 是一款集成 USB Type-C、USB Power Delivery&#xff08;PD&#xff09; 3.0/2.0 以及 PPS、QC3.0/2.0CLASS B 快充协议、华为 FCP/SCP 快充协议、三星 AFC 快充协议、VOOC 2.0 快 充协议、BC1.2 DCP 以及苹果设备 2.4A 充电规范的多功能 USB 三端口控制器&#xff0c;为…

【LeetCode刷题笔记】二维数组

498.对角线遍历 解题思路&#xff1a; 简化问题&#xff0c;首先考虑按照逐条对角线打印元素&#xff0c;而不考虑翻转的情况。 M 行 N 列的二维矩阵总共有 M N - 1 条对角线&#xff08; 右上 -> 左下 &#xff09; 1&#xff09;如何遍历&#xff1a; 从左往右遍历 对角…

【小沐学C++】git和github常见问题汇总

文章目录 1、简介2、下载和安装2.1 Git2.2 TortoiseGit 3、相关功能3.1 基本命令3.2 更新子模块命令 4、常见问题4.1 GitHub访问慢或者无法访问4.1.1 修改本地hosts映射4.1.2 通过Gitee中转fork仓库下载 4.2 OpenSSL SSL_read: Connection was reset, errno 10054 结语 1、简介…

怎么将Linux上的文件上传到github上

文章目录 1. 先在window浏览器中创建一个存储项目的仓库2. 复制你的ssh下的地址1) 生成ssh密钥 : 在Linux虚拟机的终端中,运行以下命令生成ssh密钥2)将ssh密钥添加到github账号 : 运行以下命令来获取公钥内容:3. 克隆GitHub存储库:在Linux虚拟机的终端中,导航到您想要将文件上…

redis的持久化消息队列

Redis Stream Redis Stream 是 Redis 5.0 版本新增加的数据结构。 Redis Stream 主要用于消息队列&#xff08;MQ&#xff0c;Message Queue&#xff09;&#xff0c;Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能&#xff0c;但它有个缺点就是消息无法…

OOTD | 美式复古穿搭耳机,复古轻便的头戴式耳机推荐

复古耳机更能带来年代感的复古数码产品&#xff0c;头戴式耳机就好似是时光滤镜的时髦配饰&#xff0c;不说功能实用性&#xff0c;在造型上添加就很酷。 随着时代的发展&#xff0c;时尚有了新的定义。对如今的消费者来说&#xff0c;时尚不仅是美学与个性的展现&#xff0c;…