题目描述:
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
链接:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof
1.哈希表
建立映射关系,当前节点和复制的节点。
- 复制的节点为新开辟出来的节点
- 开辟出来的节点next节点,为源节点的下一个节点的映射
- 开辟出来的节点random节点,为源节点的随机节点的映射
代码:
class Solution {
public:
Node* copyRandomList(Node* head) {
if(head == nullptr)
return nullptr;
unordered_map<Node*, Node*> map;//哈希表
Node* p = head;
while(p != nullptr)
{
map[p] = new Node(p->val);//建立映射关系
p = p->next;
}
p = head;
while(p != nullptr)
{
map[p]->next = map[p->next];//开辟的节点的next节点
map[p]->random = map[p->random];//开辟的节点的random节点
p = p->next;
}
return map[head];
}
};
2.合并拆分
思路:原地复制节点,并将该节点置于当前节点的后面。
class Solution {
public:
Node* copyRandomList(Node* head) {
if(head == nullptr)
return nullptr;
Node* p = head;
while(p != nullptr)//复制
{
Node* tmp = new Node(p->val);
tmp->next = p->next;
p->next = tmp;
p = tmp->next;
}
Node* ret = head->next;
Node* s = ret;
p = head;
while(p != nullptr)//改变random指向
{
if(p->random != nullptr)
p->next->random = p->random->next;
p = p->next->next;
}
p = head;
while(p != nullptr)//拆分
{
p->next = p->next->next;
p = p->next;
if(s->next != nullptr)
s->next = p->next;
s = s->next;
}
return ret;
}
};