深拷贝,是指将该链表除了正常单链表的数值和next指针拷贝,再将random指针进行拷贝
想法一
先拷贝出一份链表,再对于每个节点的random指针,在原链表进行遍历,找到random指针的指向,最后完成拷贝链表random的指向
时间复杂度:O(N^2)
想法二
下面这种方法,是使用C语言的最优解
时间复杂度:O(N)
完整代码如下:
struct Node* copyRandomList(struct Node* head)
{
//1.拷贝节点插入原节点的后面
struct Node* cur = head;
while (cur)
{
struct Node* copy = (struct Node*)malloc(sizeof(struct Node));
copy->val = cur->val;
struct Node* next = cur->next;
copy->next = next;
cur->next = copy;
cur = next;
}
//2.控制拷贝节点的random
cur = head;
while (cur)
{
struct Node* copy = cur->next;
if (cur->random)
{
copy->random = cur->random->next;
}
else
{
copy->random = NULL;
}
cur = copy->next;
}
//3.拷贝节点解下来组成拷贝链表,恢复原链表
cur = head;
struct Node* copyHead = NULL;
struct Node* copyTail = NULL;
while (cur)
{
struct Node* copy = cur->next;
struct Node* next = copy->next;
if (copyTail)
{
copyTail->next = copy;
copyTail = copyTail->next;
}
else
{
copyHead = copyTail = copy;
}
cur->next = next;
cur = next;
}
return copyHead;
}