给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的深度拷贝
我们可以分成三步:
- 1 将拷贝节点链接到原节点的后面
- 2 设置拷贝节点的random
这时每个copy的前一个就是原节点
- 3 把拷贝节点拿下来,尾插
/**
* Definition for a Node.
* struct Node {
* int val;
* struct Node *next;
* struct Node *random;
* };
*/
struct Node* copyRandomList(struct Node* head) {
struct Node* cur = head;
//将拷贝节点链接到原节点后面
while(cur)
{
struct Node* next = cur->next;
struct Node* copy = (struct Node*)malloc(sizeof(struct Node));
//赋值
copy->val = cur->val;
copy->next = next;
cur->next = copy;
cur = next;
}
//设置random
cur = head;
while(cur)
{
struct Node* copy = cur->next;
if(cur->random == NULL)
{
copy->random = NULL;
}
else
{
copy->random = cur->random->next;
}
cur = cur->next->next;
}
//尾插
cur = head;
struct Node* copyHead = NULL, *copyTail = NULL;
while(cur)
{
struct Node* copy = cur->next;
struct Node* next = copy->next;
//把原节点链接回来
cur->next = next;
if(copyTail == NULL)
{
copyHead = copyTail = copy;
}
else
{
copyTail->next = copy;
copyTail = copyTail->next;
}
cur = next;
}
return copyHead;
}
大家不会的可以学我画个图,真的很有用。有问题可以私信我,我也是刚学,咱们可以探讨探讨