目录
题目:剑指 Offer 35. 复杂链表的复制 - 力扣(Leetcode)
题目的接口:
解题思路:
代码:
过啦!!!
写在最后:
题目:剑指 Offer 35. 复杂链表的复制 - 力扣(Leetcode)
题目的接口:
/*// Definition for a Node.class Node {public: int val; Node* next; Node* random; Node(int _val) { val = _val; next = NULL; random = NULL; }};*/class Solution {public: Node* copyRandomList(Node* head) { }};
解题思路:
一开始先判断一下链表是否为空,
如果为空,直接返回空就行。
接下来是思路:
我的思路是通过原链表再复制一个链表:
所以我们的第一步就是循环创建一个链表,
接在原链表上,如上图,
然后,
第二步是将原链表的random指针同样复制到新的链表上,
(改random的图我懒得画了,如果感兴趣可以自己画一画)
最后一步就是将新的链表独立出来,
再让原链表恢复,如下图:
最后再返回新的链表的头结点即可。
代码如下:
代码:
/*// Definition for a Node.class Node {public: int val; Node* next; Node* random; Node(int _val) { val = _val; next = NULL; random = NULL; }};*/class Solution {public: Node* copyRandomList(Node* head) { //判断链表是否为空 if(!head) { return nullptr; } //复制原链表 Node* cur = head; while(cur) { //new一个新节点,并初始化val Node* copy = new Node(cur->val); copy->next = cur->next; cur->next = copy; cur = copy->next; } //复制原链表的指针 cur = head; while(cur) { //如果randam是指向空指针就不用管(因为原本就是空) if(cur->random) { cur->next->random = cur->random->next; } cur = cur->next->next; } //将原链表还原,将新链表独立出来 Node* newhead = head->next; Node* prev = head; cur = newhead; while(cur->next) { //还原原链表 prev->next = prev->next->next; prev = prev->next; //独立新链表 cur->next = cur->next->next; cur = cur->next; } //新链表的尾 prev->next = nullptr; //返回新链表的头 return newhead; }};
过啦!!!
写在最后:
以上就是本篇文章的内容了,感谢你的阅读。
如果喜欢本文的话,欢迎点赞和评论,写下你的见解。
如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。
之后我还会输出更多高质量内容,欢迎收看。