
前言
随机链表的复制是数据结构中的经典难题,核心难点在于复制节点的 random 指针——其指向的节点可能尚未创建,也可能指向链表中的任意节点。本文采用'原地拷贝 + 拆分'的最优思路,分三步拆解解题逻辑,结合代码实现与原理分析,清晰讲解如何高效解决该问题,帮助读者吃透 random 指针的处理技巧,掌握链表操作的核心思维。
一、随机链表的复制
1.1 题目
链接:随机链表的复制


1.2 算法原理
第一步:依次拷贝每个节点放在原节点后面

第二步:处理 random 指针指向 — 新链表 == (旧链表)random->next
第三步:把拷贝节点依次取下来尾插成新链表
1.3 代码
/* Definition for a Node.
struct Node {
int val;
struct Node *next;
struct Node *random;
};*/
typedef struct Node* Node;
struct Node* copyRandomList(struct Node* head){
// 拷贝每个节点放在原节点后面
Node cur = head;
while(cur){
Node copy = (Node)malloc(sizeof(struct Node));
copy->val = cur->val;
copy->next = cur->next;
cur->next = copy;
cur = copy->next;
}
cur = head;
(cur){
Node copy = cur->next;
(cur->random == )
copy->random = ;
copy->random = cur->random->next;
cur = copy->next;
}
cur = head;
Node copyhead = ;
Node copytail = ;
(cur){
Node copy = cur->next;
Node next = copy->next;
(copytail == )
copyhead = copytail = copy;
{
copytail->next = copy;
copytail = copytail->next;
}
cur = next;
}
copyhead;
}


