⭐️ 题目描述
🌟 leetcode链接:复制带随机指针的链表
思路:
- 第一步:在当前结点链表后面复制一个一模一样的新结点 并与旧链表连接起来。
- 第二步:给每一个 copy 结点的 random 指针赋值。
- 第三步:恢复原链表,把 copy 的结点解下来,组成新的链表。
1️⃣c代码:
/**
* Definition for a Node.
* struct Node {
* int val;
* struct Node *next;
* struct Node *random;
* };
*/
/*
思路:
第一步:在当前结点链表后面复制一个一模一样的新结点 并与旧链表联立起来。
第二步:给每一个 copy 结点的 random 指针赋值。
第三步:恢复原链表,把 copy 的结点解下来,组成新的链表。
*/
struct Node* copyRandomList(struct Node* head) {
// 复制新结点 连接到旧链表上
struct Node* cur = head;
while (cur) {
// 复制
struct Node* curCopy = (struct Node*)malloc(sizeof(struct Node));
curCopy->val = cur->val;
// 连接
curCopy->next = cur->next;
cur->next = curCopy;
// 迭代
cur = curCopy->next;
}
// 修改每一个copy结点的 random
cur = head;
while (cur) {
struct Node * curCopy = cur->next;
// 如果 cur 的 random 结点为NULL 那么 当前copy结点random也为空
if (cur->random == NULL) {
curCopy->random = NULL;
} else {
curCopy->random = cur->random->next;
}
// 迭代
cur = curCopy->next;
}
// 恢复原链表,把 copy 的结点解下来,组成新的链表
struct Node * newHead = NULL;
struct Node * tail = NULL;
cur = head;
while (cur) {
struct Node * curCopy = cur->next;
// 尾插到新链表
if (newHead == NULL) {
newHead = tail = curCopy;
} else {
tail->next = curCopy;
tail = tail->next;
}
// 迭代
cur->next = curCopy->next;
cur = cur->next;
}
return newHead;
}