
该代码采用 “原地复制+拆分” 策略,高效实现复杂链表(每个节点含val、next指针、random指针)的深拷贝,核心优势是 时间复杂度O(n)、空间复杂度O(1)(不考虑目标链表存储空间),具体分3步:
pcur,为其创建一个拷贝节点NewNode(值与原节点相同,random初始为NULL)。NewNode->next = pcur->next,再pcur->next = NewNode)。原节点1 -> 拷贝节点1 -> 原节点2 -> 拷贝节点2 -> ... -> 原节点n -> 拷贝节点n -> NULL。random指针pcur = pcur->next->next)。pcur,其拷贝节点是pcur->next: pcur的random为NULL,则拷贝节点的random也为NULL;pcur的random指向原链表中的某节点A,则拷贝节点的random应指向A的拷贝节点(即A->next),这是该方法的核心巧思(利用第一步构建的成对结构,直接通过原节点的random找到拷贝节点)。head->next)即为新链表的头节点Newhead。pcur = pcur->next->next),将拷贝节点的next指针指向下一个拷贝节点(跳过原节点),最终拆分出独立的拷贝链表。next初始指向原节点的下一个节点,random初始为NULL。A的random指向B,则拷贝节点A'的random必然指向B'(B->next)。next指向其下一个拷贝节点(pcur->next->next)即可拆分出独立的拷贝链表。typedef struct Node Node;
Node* BuyNode(int x,Node* pcur)
{
Node* NewNode = (Node*)malloc(sizeof(Node));
NewNode->val = x;
NewNode->next = pcur->next;
NewNode->random = NULL;
return NewNode;
}
struct Node* copyRandomList(struct Node* head)
{
if(head == NULL)
{
return NULL;
}
Node* pcur = head;
while(pcur)
{
Node* NewNode = BuyNode(pcur->val,pcur);
Node* prev = pcur;
pcur = pcur->next;
prev->next = NewNode;
}
pcur = head;
while(pcur != NULL && pcur->next != NULL)
{
Node* pcopy = pcur->next;
if(pcur->random == NULL)
{
pcopy->random = NULL;
}
else
{
pcopy->random = pcur->random->next;
}
pcur = pcur->next->next;
}
Node* Newhead = head->next;
pcur = Newhead;
while(pcur!= NULL && pcur->next != NULL)
{
pcur->next = pcur->next->next;
pcur = pcur->next;
}
return Newhead;
}