【LeetCode刷题指南】--随机链表的复制
🔥个人主页:@草莓熊Lotso
🎬作者简介:C++研发方向学习者
📖个人专栏: 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》
⭐️人生格言:生活是默默的坚持,毅力是永久的享受。
前言: 随着编程相关知识点的学习,我们LeetCode的刷题也不能落下。在前面我们也接触到了洛谷和牛客这两个刷题网站,但是博主一直都在推荐大家使用力扣,是因为力扣的判题严谨且大部分都是接口型题目,与面试中的笔试题也更加贴合。那么还是老样子,博主会为大家提供我自己的思路和代码,但是算法题的解法肯定不止一个,欢迎大家一起交流和讨论。
目录
链表的随机复制
解题过程:
代码演示:
链表的随机复制
题目链接:138. 随机链表的复制 - 力扣(LeetCode)
题目描述:
题目示例:
思路:在原链表基础上拷贝节点,置random指针,断开新旧链表
解题过程:
1.我们首先需要了解一下什么是浅拷贝什么是深拷贝
浅拷贝(Shallow Copy):
• 定义:仅复制变量本身的值,对于指针类型的成员,只复制指针的地址,而不复制指针所指向的内存内容。
• 特点:
◦ 拷贝后,原变量和新变量中的指针指向同一块内存空间。
◦ 实现简单,通常通过直接赋值(如=运算符)或memcpy等函数完成。
◦ 风险:当其中一个指针释放内存后,另一个指针会变成野指针,再次操作可能导致内存错误(如重复释放、访问已释放内存)。
深拷贝(Deep Copy):
• 定义:不仅复制变量本身的值,对于指针类型的成员,会先为新变量的指针分配新的内存空间,再将原指针指向的内容复制到新内存中。
• 特点:
◦ 拷贝后,原变量和新变量中的指针指向各自独立的内存空间,两者互不影响。
◦ 需要手动实现,通常通过自定义函数完成(需显式分配内存并复制内容)。
◦ 安全性高,避免了浅拷贝的内存冲突问题,但实现相对复杂,且会额外消耗内存。
2. 在原链表的基础上拷贝节点
3.置random指针
一定要记住:copy->random=pcur->random->next
4.断开新旧链表
时间复杂度:O(N)
代码演示:
/*** Definition for a Node.* struct Node {* int val;* struct Node *next;* struct Node *random;* };*/
typedef struct Node Node;
Node* BuyNode(int x)
{Node*newnode=(Node*)malloc(sizeof(Node));newnode->val=x;newnode->next=newnode->random=NULL;return newnode;
}
void InsertaList(Node*head)
{Node*pcur=head;while(pcur){Node*newnode=BuyNode(pcur->val);Node*next=pcur->next;pcur->next=newnode;newnode->next=next;pcur=next;}
}
void SetRandom(Node*head)
{Node*pcur=head;while(pcur){Node*copy=pcur->next;if(pcur->random)copy->random=pcur->random->next;pcur=copy->next;}
}
struct Node* copyRandomList(struct Node* head) {if(head==NULL){return head;}//拷贝原链表的节点并插入原链表中InsertaList(head);//设置randomSetRandom(head);//断开新的链表Node*pcur=head;Node*copyhead,*copytail;copyhead=copytail=pcur->next;while(copytail->next){pcur=copytail->next;copytail->next=pcur->next;copytail=copytail->next;}return copyhead;
}
这里需要特别注意一下,如果为空特殊处理,不然运行会有问题
往期回顾:
【数据结构初阶】--双向链表(一)
【数据结构初阶】--双向链表(二)
结语:本篇文章就到此结束了,《LetetCode刷题指南》中的题目比起之间的C语言刷题集中的题目,肯定会更加复杂一些。而且题目形式也不一样,大家需要注意一下。如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持