一.前言
昨天下午刷这道题目时,刚开始看题,觉得题目说得很明白,首先想到"取巧",直接返回节点,结果题目输出直接就不爽了,emmm报错.没法子,开始正经思考.....
二.难点
这道题的难点在于如何让新创建出来的节点的random指针指向新创建的特点节点(而不是给定的节点),我一开始做题时也想到第一次遍历创建一个新的链表,只是对next节点赋值,random指针不管,然后第二遍遍历时懵圈了,直接让random指针指向题目给定的原来链表的random处....结果毫无疑问,报错了....
三.突破
问题到这里已经很明确了,我们要让创建的新节点的random指针指向新创建的节点,那么如何实现从原random指向的节点到我们想指向的新random指向的节点呢?我们可以使用unordered_map或者直接使用map来完成映射
四.思路
分析到这一步,思路就很简单了,我们首先一遍遍历创建新链表,并且只赋值它的next指针,第二遍遍历时我们通过hash表映射来实现从原random节点到新链表的random节点的映射,这道题就算是做完了.代码如下:
class Solution {
public:
Node* copyRandomList(Node* head) {
unordered_map<Node*, Node*> map;
Node* cur = head;
while (cur) {
map[cur] = new Node(cur->val);
cur = cur->next;
}
cur = head;
while (cur) {
map[cur]->next = map[cur->next];
map[cur]->random = map[cur->random];
cur = cur->next;
}
return map[head];
}
};