基于这篇文章算法的改进随机链表复制
这道题的关键在于完成链表复制后,如何修改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;