1.题目解析
题目来源:138.随机链表的复制——力扣
本题不同于普通的链表复制,这里的每一个节点不止有一个next指针还有一个random指针随机连接其他节点,所以需要深拷贝复制,这就考验对链表节点的链接能力
测试用例
2.算法原理
这里我们的思路是拷贝原链表但不处理random指针,拷贝完成后使用原链表的映射来处理拷贝后链表的random指针,所以可以使用map容器来完成映射,即在拷贝链表时需要将原链表的节点拷贝到map中,然后在处理random节点时从map容器中取出映射在拷贝后链表上链接random指针即可
3.代码展示
class Solution {
public:
Node* copyRandomList(Node* head)
{
map<Node*,Node*> mymap;
Node* copyhead = nullptr;
Node* copytail = nullptr;
Node* cur = head;
//拷贝原链表
while(cur)
{
if(copytail == nullptr)
{
copytail = copyhead = new Node(cur->val);
}
else
{
copytail->next = new Node(cur->val);
copytail = copytail->next;
}
//将原链表存入map容器中
mymap[cur] = copytail;
cur = cur->next;
}
//使用map容器映射处理random指针
cur = head;
Node* copy = copyhead;
while(cur)
{
if(cur->random == nullptr)
{
copy->random = nullptr;
}
else
{
copy->random = mymap[cur->random];
}
cur = cur->next;
copy = copy->next;
}
return copyhead;
}
};