🐶博主主页:@ᰔᩚ. 一怀明月ꦿ
❤️🔥专栏系列:线性代数,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=head while(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; }
🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸