基于这篇文章算法的改进随机链表复制
这道题的关键在于完成链表复制后,如何修改random指针。即如何通过遍历原链表找到复制链表的结点。
过去的算法是修改原链表的next,让每个复制结点位于原链表结点后面。
但是,在C++的STL库中,有应用于KV模型的容器map,因此有了新的思路:
map 的结点为 K原链表结点和V复制链表结点
先完成复制链表,同时将<原链表结点,复制链表结点>的键值对存到map中。
再遍历原链表,此时,可以通过基于库中map类重载的[]运算符,就能返回原链表结点中random指向结点对应的V即复制结点。
Node* copyRandomList(Node* head) {
Node* copyhead = nullptr,*copytail = nullptr;
Node* cur = head;
map<Node*,Node*> Node_map;
while(cur)
{
if(copytail == nullptr)
{
copyhead = copytail = new Node(cur->val);
}
else
{
copytail->next = new Node(cur->val);
copytail = copytail->next;
}
Node_map[cur] = copytail;
cur = cur->next;
}
cur = head;
Node* copy = copyhead;
while(cur)
{
if(cur->random == nullptr)
{
copy->random = nullptr;
}
else{
copy->random = Node_map[cur->random];
}
cur = cur->next;
copy = copy->next;
}
return copyhead;