题目:
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的 深拷贝。
我们用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:
val:一个表示 Node.val 的整数。
random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为 null 。

方法一:哈希表unordered_map
class Solution {
public:
Node* copyRandomList(Node* head) {
if (head == nullptr)
return head;
//遍历原链表 创建新链表节点并建立映射关系
unordered_map<Node*, Node*> map; //<原链表节点,对应位置的新链表节点>
Node* cur = head;
while (cur)
{
map[cur] = new Node(cur->val);
cur = cur->next;
}
//遍历原链表 根据map链接新链表
cur = head;
while (cur)
{
Node* node = map[cur];
node->next = map[cur->next];
node->random = map[cur->random];
cur = cur->next;
}
return map[head];
}
};
方法二:传统做法 复制链表+穿针引线+分隔链表
class Solution {
public:
Node* copyRandomList(Node* head) {
if (head == nullptr) {
return head;
}
Node *node = head;
//1. 将复制节点添加到原节点后面
while (node != nullptr) {
Node *copy = new Node(node->val, nullptr, nullptr);
copy->next = node->next;
node->next = copy;
node = copy->next;
}
//2. 复制random节点
node = head;
while (node != nullptr) {
if (node->random != nullptr) {
node->next->random = node->random->next;
}
node = node->next->next;
}
//3. 分离链表
node = head;
Node *newHead = head->next;
Node *newNode = newHead;
while (node != nullptr) {
node->next = node->next->next;
if (newNode->next != nullptr) {
newNode->next = newNode->next->next;
}
node = node->next;
newNode = newNode->next;
}
return newHead;
}
};

本文介绍两种链表深拷贝的方法,包括使用哈希表的高效解决方案和传统复制链表加穿针引线的技巧。通过具体代码示例,详细解析了如何处理链表中额外的随机指针,实现链表的完整复制。
1286

被折叠的 条评论
为什么被折叠?



