思路分析
**这道题也叫做链表的深拷贝,就是有一个链表,他有两个指针,一个指向随机值,一个指向下一个,要求我们拷贝一份这样的链表。 **
我们的答题思路是,先在创建每个节点,链接到原节点的后面,然后它的随机指针就是源节点的随机指针的next,然后把拷贝的节点尾插。
图解及代码实现
struct Node* copyRandomList(struct Node* head)
{
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;
//链接随机指针 copy->random = cur->random->next
while(cur)
{
struct Node* copy = cur->next;
if(cur->random == NULL)
{
copy->random = NULL;
}
else
{
copy->random = cur->random->next;
}
cur = copy->next;
}
cur = head;
//尾插
struct Node* copyhead = NULL;
struct Node* copytail = NULL;
while(cur)
{
struct Node* copy = cur->next;
struct Node* next = copy->next;
if(copytail == NULL)
{
copyhead = copytail = copy;
}
else
{
copytail->next = copy;
copytail = copytail->next;
}
cur->next = next;
cur = next;
}
return copyhead;
}
1.先创建节点,链接到原链表每个节点的后面。
2.然后就是 copy->random = cur->random->next 的理解到位,如果原节点的 random 指为NULL,则 copy->random 也指为 NULL。
3.把 copy 的节点拿下来尾插一个新链表,返回。最重要的是明白 copy->random = cur->random->next