复制带随机指针的链表
✔题目链接:
✔题目:
给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。
构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。
言简意赅 --> 复制链表
示例:
✔解题思路:
解题思路:
1.拷贝链表的每一个节点,拷贝的节点先链接到被拷贝节点的后面
2.复制随机指针的链接:拷贝节点的随机指针指向被拷贝节点随机指针的下一个位置
3.拆解链表,把拷贝的链表从原链表中拆解出来
🔎代码详情:
struct Node* copyRandomList(struct Node* head) {
//1.首先要将拷贝的结点连接到原链表后面
//->插入拷贝的结点
struct Node* cur = head;
while(cur)
{
//创建一个copy节点和next节点
struct Node* copy =(struct Node*)malloc(sizeof(struct Node));
struct Node* next = cur->next;
copy->val = cur->val;
//插入
cur->next = copy;
copy->next = next;
cur = next;
}
//2.然后拷贝节点的random
cur = head;
while(cur)
{
//定义原链表后面的一个节点为copy
struct Node* copy = cur->next;
//若随机值为空,则直接赋值
//若不为空,则赋值给cur随机值的下一个
if(cur->random == NULL)
{
copy->random = NULL;
}
else
{
copy->random = cur->random->next;
}
//移动
cur = copy->next;
}
//3.最后将节点解下来,链接形成新的链表
cur = head;
if(head == NULL)
{
return NULL;
}
struct Node* copy = cur->next;
struct Node* tail = copy;
while(cur)
{
//链接
cur = tail->next;
if(cur)
{
tail->next = cur->next;
tail = tail->next;
}
}
tail->next = NULL;
return copy;
}
感谢家人的阅读,若有不准确的地方 欢迎在评论区指正!