C语言/数据解构——(随即链表的复制)

news2024/10/5 16:19:04

一.前言

嗨嗨嗨,大家好久不见。已经有好几天没更新了。今天我们就分享一道链表题吧——随即链表的复制https://leetcode.cn/problems/copy-list-with-random-pointer废话不多说,让我们直接开始今天的题目分享吧。

二.正文

1.1题目描述

他和单链表不同的是,结构体里还多一个random指针,指向随机节点。

这道题的意思就是想让我们将原链表完全复制下来,并且将复制好的链表返回到服务器上。

1.2题目分析

(i)创建节点,并尾插到原节点后

这道题我们可以通过遍历一个节点的同时,就穿插一个复制该节点数据的复制节点在该节点后面。

通过循环语句,我们最后会得到一个每一个原节点的后面尾插了一个新的复制节点。如图所示:

这里我们只是先处理了next指针,下面我们将处理random指针。让复制节点的random指针指向和原节点保持一致。

值得注意的是上面的这些节点是我们通过malloc函数自己手动创建的。红叉的地方意味着原来的next指向断掉了。

(ii)将复制节点的random指针指向正确位置

这里我们需要让复制节点的random指针和原节点指向一致,但不是指向原节点,而是指向复制节点。

如果原节点的random指针指向为NULL,那么与之对应的,该节点的复制节点也需要指向NULL。

如果该节点(假设l1)的random指针不指向NULL。而是指向另外一个节点(假设为l2)。那么与之对应的,l1的复制节点的random也应该指向l2的复制节点。那么这一步该如何实现呢?

我们假设一个指针pcur现在指向第三个节点13。pcur->next->random=pcur->random->next。

这样两个复制节点就可以通过pcur建立联系了。如图所示:

(iii)将复制链表从原链表上剥离下来

这里我们可以创建一个哨兵位,然后陆续从后面插入我们需要的复制节点即可。然后将哨兵位后面的有效节点存起来,在哨兵位free掉,归还给操作系统,将指向该哨兵位节点的指针置为NULL。最后返回之前存的有效节点即可

1.3代码实现

**
 * Definition for a Node.
 * struct Node {
 *     int val;
 *     struct Node *next;
 *     struct Node *random;
 * };
 */
typedef struct Node ListNode;
struct Node* copyRandomList(struct Node* head)
{
    if(head==NULL)
    return head;
	ListNode* pcur = head;
	while (pcur)
	{
		ListNode* copy = (ListNode*)malloc(sizeof(ListNode));
		copy->val = pcur->val;
		copy->next = pcur->next;
		pcur->next = copy;
		pcur = pcur->next->next;
	}
	pcur = head;
	while (pcur)
	{
		ListNode* copy = pcur->next;
		if (pcur->random == NULL)
			copy->random= NULL;
		else
			pcur->next->random = pcur->random->next;
		pcur = copy->next;
	}
	ListNode* newhead = (ListNode*)malloc(sizeof(ListNode));
	ListNode* ppcur;
	ppcur = newhead;
	pcur = head->next;
	int count = 0;
	while (pcur)
	{
		if (count % 2 == 0)
		{
			ppcur->next = pcur;
			ppcur = ppcur->next;
		}
		pcur = pcur->next;
		count++;
	}
	ListNode* ret = newhead->next;
	free(newhead);
	newhead = NULL;
	return ret;
}

值得注意的是上面的代码是在力扣环境上运行的。

三.前言

今天的分享就到此结束喽,咱们下次再见,拜拜。

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

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

相关文章

JDK APT(Annotation Processing Tool) 编译时注解处理器

博文目录 文章目录 javacAnnotation ProcessingHow Annotation Processing WorksCompilation Environment and Runtime Environment maven-compile-plugin对 Maven pom 中配置注解处理器的理解Lombok, MapStruct, MyBatis-Flex 说明测试只在 dependencies 中配置 Lombok 和 Ma…

vue element checkbox的实现

实现多选非常简单: 手动添加一个el-table-column,设type属性为selection即可;默认情况下若内容过多会折行显示,若需要单行显示可以使用show-overflow-tooltip属性,它接受一个Boolean,为true时多余的内容会在 hover 时以…

回溯之组合总和II

上一篇文章使用回溯解决了组合总和I,这次使用回溯解决组合总和II,下面先给出回溯的模板代码。 private void backtracking(参数1,参数2,...){if(递归终止条件){收集结果;return;}for(遍历集合){处理;backtracking(参数1,参数2,...); // 递归;回溯;} }组…

机器学习1——线性回归、误差推导

有监督——分类、回归 一、线性回归 对于一个线性方程,没办法拟合所有的数据点,但是要尽可能的覆盖尽可能多的点。 在下面的图中,x01。添加这一项的目的是:将数据矩阵补全(比如年龄是x1、工资是x2,那么x0手…

Liquid Volume 2

水、液体、流体特效着色器 下载:​​Unity资源商店链接资源下载链接 效果图:

图文并茂:解析Spring Boot Controller返回图片的三种方式

欢迎来到我的博客,代码的世界里,每一行都是一个故事 图文并茂:解析Spring Boot Controller返回图片的三种方式 前言使用Base64编码返回图片使用byte数组返回图片使用Resource对象返回图片图片格式转换与性能对比 前言 在互联网的世界里&…

18.04版本的ubuntu没有连接网络的图标(坑人版)

以下更新内核别看,因为后面安装驱动报一堆错误!!! 不升级内核成功方法跳转连接:https://blog.csdn.net/weixin_53765004/article/details/138771613?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%2213877…

GIT基础01 基础命令与分支

前言 我们知道git是开发中比较常见的版本控制工具 我们可以先提出一个场景: 老板让你去修改方案 第一次修改 打回 第二次修改 打回 第n次修改 老板让你使用第一次的版本 阁下如何应对??? 我对每个版本进行编号?? 是一种方案 但是这里也是有缺陷的 比如说在很多版本中找…

【AI+漫画】程序员小李解决疑难杂症BUG的日常

周末花了点时间制作的AI漫画。 感慨一句,程序人生, 相伴随行。 原文链接:【AI漫画】程序员小李解决疑难杂症BUG的日常

基于docker 的elasticsearch冷热分离及生命周期管理

文章目录 冷热集群架构的应用场景冷热集群架构的优势冷热集群架构实战搭建集群 索引生命周期管理认识索引生命周期索引生命周期管理的历史演变索引生命周期管理的基础知识Rollover:滚动索引 冷热集群架构的应用场景 某客户的线上业务场景如下:系统每天增…

网安面经之SSRF漏洞

一、ssrf漏洞 1、ssrf原理?危害?修复(防御)? 原理:SSRF就是服务器端请求伪造漏洞、它是一种由攻击者构造,由服务端发起请求的一个网络攻击,一般用来在外网探测或攻击内网服务&…

程序猿成长之路之数据挖掘篇——距离公式介绍

上一篇介绍了朴素贝叶斯,那么这次讲讲距离公式 什么是距离公式 用自己的话来说距离公式就是判断两个属性(参数)相似度的度量公式,比如以两点间距离为例,A地经纬度为(110.9802,120.9932),B地经纬度为(110.9980,120.828…

c++04STL部分复习

1、deque list vector概括: /* deque :双端队列容器 底层数据结构:动态开辟的二维数组,一维数组从2开始,以2倍的方式进行扩容,每次扩容后,原来的第二维的数组 从新的第一堆数组下表的oldsize/2开始存放&am…

XYCTF - web

目录 warm up ezMake ezhttp ezmd5 牢牢记住,逝者为大 ezPOP 我是一个复读机 ezSerialize 第一关 第二关 第三关 第一种方法: 第二种方法: ez?Make 方法一:利用反弹shell 方法二:通过进制编码绕过 ε…

EasyImage2.0 图床源码

EasyImage2.0 是一个简单图床的源码,它支持以下功能: 1. API接口 2. 登录后才能上传图片 3. 设置图片质量 4. 压缩图片大小 5. 添加文字或图片水印 6. 设定图片的宽度和高度 7. 将上传的图片转换为指定的格式 8. 限制上传图片的最小宽度和高度 …

《软件方法(下)》8.3.3 泛化的一些重点讨论(202405更新)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 8.3 建模步骤C-2 识别类的关系 8.3.3 泛化的一些重点讨论 8.3.3.1 子集的不相交和完整 泛化是集合关系,在建模泛化关系时,我们对泛化关系中的子类&#xff0…

JavaEE初阶-多线程5

文章目录 一、线程池1.1 线程池相关概念1.2 线程池标准类1.3 线程池工厂类1.4 实现自己的线程池 二、定时器2.1 java标准库中的定时器使用2.2 实现一个自己的定时器2.2.1 定义任务类2.2.2 定义定时器 一、线程池 1.1 线程池相关概念 池这个概念在计算机中比较常见&#xff0c…

极验4图标方向点选验证码

验证码如下如所示,提供了三个方向剪头。根据剪头顺序,点击大图中图标的方向完成验证。 经过我们的努力,正确率达到了90%左右。下面提供了验证码识别的代码。 import base64 import requests import datetime from io import BytesIO from PI…

Linux-软件安装--tomcat的安装

tomcat的安装 1、下载tomcat安装包2.移动到自己想要解压的目录3、解压文件夹4、启动tomcat5、查看tomcat进程6、查看日志7、通过浏览器访问成功8、停止tomecat服务8.1运行tomcat的bin目录中提供的停止服务的脚本文件shutdcwn.sh8.2结束tomcat进程1、下载tomcat安装包 本篇文章…

蓝海创业商机小吃配方项目,日入200+ ,小白可上手,图文创作转现快

小吃技术销售,一单价格从几元到几百元不等,行业竞争相对较小,是一个相对冷门的领域。只需一部手机,就可以发布图文并茂的内容,配上背景音乐(BGM),即使是对视频剪辑不熟悉的新手&…