题目描述:请实现copyRandomList函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个next指针指向下一个节点,还有一个random指针指向链表中的任意节点或者NULL;
题目疑问:链表复制明明可以直接遍历链表,创建新节点实现,这里的random指针起什么作用?
题目解疑:如题目所述,这里需要的是复杂链表的复制,这里的random指针起什么作用并不重要,重要的是我们如何将随机指针正确的复制过去。
思路:利用哈希表的查询特点,考虑构建原链表节点和新链表对应节点的键值对映射关系,再遍历构建新链表个节点的next和random引用指向即可。换句话说就是遍历两边,第一遍只构建新节点,第二遍再构建新节点的next和cur。
图解:
代码实现:
Node* copyRandomList(Node* head)
{
if (head == NULL)return NULL;
unordered_map<Node*, Node*>map;
Node* cur = head;
while (cur != NULL)
{
map[cur] = new Node(cur->val);
cur = cur->next;
}
cur = head;
while (cur != NULL)
{
map[cur]->next = map[cur->next];
map[cur]->random = map[cur->random];
cur = cur->next;
}
return map[head];
}