每日一题(随机链表的复制)

 

感谢大佬的光临各位,希望和大家一起进步,望得到你的三连,互三支持,一起进步

个人主页LaNzikinh-CSDN博客

收入专栏:初阶数据结构_LaNzikinh篮子的博客-CSDN博客


138. 随机链表的复制 - 力扣(LeetCode)

给你一个长度为 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]]

拿到一个人题目的时候先要想这个题目是要我们干什么,这个题目是随机节点的复制,意思就是说他会随机给你一段这样的带有随意random节点的链表,让你写一个代码将他复制下来,那我们要怎么去思考呢?

思路:分为3步,1.复制节点且插入,2.根据原节点的random,处理复制节点的random,3.复制节点解下来链成一个新链表,恢复链表链接关系。

一.复制节点且插入

这是什么意思呢,就是在原来的链表中复制一些节点,把他们插入之前的链表中去

	//复制节点且插入
	//将头节点存入cur
	struct Node* cur = head;
	//只要cur不为空,就一只向前走
	while (cur!=NULL)
	{
		//利用malloc函数来开辟空间
		struct Node* copy = (struct Node*)malloc(sizeof(struct Node*));
		//插入copy节点
		copy->next = cur->next;
		cur->next = copy;
      //cur向前走,去复制下一个节点
		cur = copy->next;
	}

二.根据原节点的random,处理复制节点的random

这个题的难点就是对random的处理,该怎么样才能让我复制的节点random的指向和原链表符合

//根据原节点的random,处理复制节点的random
//先将原链表的节点保存在cur中
cur = head;
//只要cur不为空,就一只向前走
while (cur)
{
	//将copy赋给cur的下一个,因为直接已经插入了链表
	struct Node* copy = cur->next;
	//如果random为空,复制的链表也为空
	if (cur->random == NULL)
	{
		copy->random = NULL;
	}
	//如果不为空,复制链表的random,就为cur的random所指向的下一个
	else
	{
		copy->random = cur->random->next;
	}
	//cur向前走
	cur = copy->next;
}

三.复制节点解下来链成一个新链表,恢复链表链接关系

这个就比较轻松了,就是将开辟的链表解开,在把之前的链表恢复,然后返回我复制的链表就可以了

	//复制节点解下来链成一个新链表,恢复链表链接关系
	//开辟连个节点
	struct Node* copyHead = NULL;
	struct Node* copyTail = NULL;
	将头节点存入cur
	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= copy;
		}
		cur->next = next;
		cur = next;
	}

	return copyHead;

}

总代码


struct Node* copyRandomList(struct Node* head)
{
	//复制节点且插入
	//将头节点存入cur
	struct Node* cur = head;
	//只要cur不为空,就一只向前走
	while (cur!=NULL)
	{
		//利用malloc函数来开辟空间
		struct Node* copy = (struct Node*)malloc(sizeof(struct Node*));
		//插入copy节点
		copy->next = cur->next;
		cur->next = copy;
		cur = copy->next;
	}
	//根据原节点的random,处理复制节点的random
	//先将原链表的节点保存在cur中
	cur = head;
	//只要cur不为空,就一只向前走
	while (cur)
	{
		//将copy赋给cur的下一个,因为直接已经插入了链表
		struct Node* copy = cur->next;
		//如果random为空,复制的链表也为空
		if (cur->random == NULL)
		{
			copy->random = NULL;
		}
		//如果不为空,复制链表的random,就为cur的random所指向的下一个
		else
		{
			copy->random = cur->random->next;
		}
		//cur向前走
		cur = copy->next;
	}
	//复制节点解下来链成一个新链表,恢复链表链接关系
	//开辟连个节点
	struct Node* copyHead = NULL;
	struct Node* copyTail = NULL;
	将头节点存入cur
	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= copy;
		}
		cur->next = next;
		cur = next;
	}

	return copyHead;

}
  • 68
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 87
    评论
评论 87
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaNzikinh篮子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值