C语言中链表经典面试题目——复制带随机指针的链表

news/2024/10/23 17:25:48/

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++,数据结构​​​​​​​

🔥座右铭:“不要等到什么都没有了,才下定决心去做”

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

​​​​​​​ 复制带随机指针的链表


​​​​​​​ 复制带随机指针的链表

 

难度:中等

描述:

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

示例 1:

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

示例 2:

输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]

示例 3:

输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]

提示:

  • 0 <= n <= 1000
  • -104 <= Node.val <= 104
  • Node.random 为 null 或指向链表中的节点。

解题思路:

1.复制链表并把复制的链表有规则的链接在原链表上,这里的复制仅复制了原链表的val值。

//cur=headwhile(cur){struct Node* copy=(struct Node*)malloc(sizeof(struct Node));//创建节点复制原链表的节点中val值copy->val=cur->val;copy->next=cur->next;cur->next=copy;cur=copy->next;}

2.原链表节点的random和复制链表的节点random建立了关系,这样就可以方便复制random值了。因为原链表节点的random指向的下一个位置就是复制链表random指向的位置。

    cur=head;struct Node* copy=cur->next;while(cur){copy=cur->next;if(cur->random==NULL)//这里需要特殊考虑一下,如果原链表的random指向的是NULL,则需要将复制链表的random指向NULL{copy->random=NULL;}else{copy->random=cur->random->next;}cur=copy->next;}

3.解链表,将原链表和复制链表分开,然后返回复制链表头节点的位置

    cur=head->next;struct Node* phead=cur;struct Node* prev=head;while(cur){prev->next=cur->next;prev=cur;cur=cur->next;}return phead;

源码:

struct Node* copyRandomList(struct Node* head) 
{if(head==NULL){return NULL;}struct Node* cur=head;while(cur){struct Node* copy=(struct Node*)malloc(sizeof(struct Node));copy->val=cur->val;copy->next=cur->next;cur->next=copy;cur=copy->next;}cur=head;struct Node* copy=cur->next;while(cur){copy=cur->next;if(cur->random==NULL){copy->random=NULL;}else{copy->random=cur->random->next;}cur=copy->next;}cur=head->next;struct Node* phead=cur;struct Node* prev=head;while(cur){prev->next=cur->next;prev=cur;cur=cur->next;}return phead;
}

 🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸 ​​​​​​​ 


http://www.ppmy.cn/news/69203.html

相关文章

20230513----重返学习-同步异步任务-作用域与this指向与变量自增-发布订阅设计模式-webpack

day-069-sixty-nine-20230513-同步异步任务-作用域与this指向与变量自增-发布订阅设计模式-webpack 同步异步任务 所有的代码都是在ECStack执行环境栈-即主线程开始的。 这个也有人认为它是宏任务&#xff0c;进而得出&#xff1a; 标签由宏任务开始->把异步任务放到WebAPI…

在 Laravel 控制器构造函数中获取当前用户(或其他会话数据)

让我们讨论一些很多人无意中发现的事情&#xff1a;您不能直接在控制器的构造函数中使用会话数据。 此更改是在 Laravel 5.3 中引入的&#xff0c;当时重新连接了中间件管道以使全局范围与会话数据一起工作。 在这篇文章中&#xff0c;我们将更详细地研究这个问题&#xff0c…

CSP-202212-2 训练计划

目录 一、题目 二、思路 三、C代码如下 一、题目 问题背景 西西艾弗岛荒野求生大赛还有 n 天开幕&#xff01; 问题描述 为了在大赛中取得好成绩&#xff0c;顿顿准备在 n 天时间内完成“短跑”、“高中物理”以及“核裂变技术”等总共 m 项科目的加强训练。其中第 i 项…

离散数学_九章:关系(3)

9.3 关系的表示 1、用集合表示关系2、用矩阵表示关系矩阵表示关系⭐集合上的关系矩阵 R 自反时 R 对称时 R 反对称时 ⭐确定关系合成的矩阵 3、用有向图表示关系有向图⭐从有向图中 确定关系具有的属性 自反性对称性反对称性传递性 本节及本章的剩余部分研究的所有关系均为二…

边缘网关协议(BGP)的演进与发展

边缘网关协议(Border Gateway Protocol&#xff0c;BGP)是一种用于在网络边缘传输路由信息的协议。它被广泛用于骨干网络和接入网络中&#xff0c;用于在网络边缘路由流量&#xff0c;并确保不同的网络之间具有最佳的路由路径。BGP是由RIP协议发展而来的&#xff0c;但在实现和…

Flink 常用API(2)——转换算子+聚合算子

转换算子&#xff08;Transformation&#xff09; 映射&#xff08;map&#xff09; 用于将数据流中的数据进行转换&#xff0c;形成新的数据流 “一一映射”&#xff0c;消费一个元素就产出一个元素 参数&#xff1a;接口 MapFunction 的实现 方法&#xff1a;map 返回值…

泼辣修图app下载2024最新版修图滤镜

泼辣修图专业版是一款强大的专业修图软件&#xff0c;拥有上百款调色工具还有丰富的图层素材&#xff0c; 更有智能的人像修饰面板&#xff0c;具备物体识别的智能蒙板&#xff0c;高效的滤镜管理系统和强大的文字工具&#xff0c;支持批量处理。一切围绕摄影&#xff0c;无论是…

【P1003 [NOIP2011 提高组] 铺地毯】

[NOIP2011 提高组] 铺地毯 题目描述 为了准备一个独特的颁奖典礼&#xff0c;组织者在会场的一片矩形区域&#xff08;可看做是平面直角坐标系的第一象限&#xff09;铺上一些矩形地毯。一共有 n n n 张地毯&#xff0c;编号从 1 1 1 到 n n n。现在将这些地毯按照编号从小…