🐶博主主页:@ᰔᩚ. 一怀明月ꦿ
❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++,数据结构
🔥座右铭:“不要等到什么都没有了,才下定决心去做”
🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀
目录
复制带随机指针的链表
复制带随机指针的链表
难度:中等
描述:
给你一个长度为
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]]示例 2:
输入:head = [[1,1],[2,1]] 输出:[[1,1],[2,1]]示例 3:
输入:head = [[3,null],[3,0],[3,null]] 输出:[[3,null],[3,0],[3,null]]提示:
0 <= n <= 1000
-104 <= Node.val <= 104
Node.random
为null
或指向链表中的节点。解题思路:
1.复制链表并把复制的链表有规则的链接在原链表上,这里的复制仅复制了原链表的val值。
//cur=headwhile(cur){struct Node* copy=(struct Node*)malloc(sizeof(struct Node));//创建节点复制原链表的节点中val值copy->val=cur->val;copy->next=cur->next;cur->next=copy;cur=copy->next;}
2.原链表节点的random和复制链表的节点random建立了关系,这样就可以方便复制random值了。因为原链表节点的random指向的下一个位置就是复制链表random指向的位置。
cur=head;struct Node* copy=cur->next;while(cur){copy=cur->next;if(cur->random==NULL)//这里需要特殊考虑一下,如果原链表的random指向的是NULL,则需要将复制链表的random指向NULL{copy->random=NULL;}else{copy->random=cur->random->next;}cur=copy->next;}
3.解链表,将原链表和复制链表分开,然后返回复制链表头节点的位置
cur=head->next;struct Node* phead=cur;struct Node* prev=head;while(cur){prev->next=cur->next;prev=cur;cur=cur->next;}return phead;
源码:
struct Node* copyRandomList(struct Node* head) {if(head==NULL){return NULL;}struct Node* cur=head;while(cur){struct Node* copy=(struct Node*)malloc(sizeof(struct Node));copy->val=cur->val;copy->next=cur->next;cur->next=copy;cur=copy->next;}cur=head;struct Node* copy=cur->next;while(cur){copy=cur->next;if(cur->random==NULL){copy->random=NULL;}else{copy->random=cur->random->next;}cur=copy->next;}cur=head->next;struct Node* phead=cur;struct Node* prev=head;while(cur){prev->next=cur->next;prev=cur;cur=cur->next;}return phead; }
🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸