题目:题目链接
思路:深度拷贝。有递归和迭代两种方式
方法一 递归
参考:官方题解
class Solution {
public:
unordered_map<Node*, Node*> cachedNode;
Node* copyRandomList(Node* head) {
if (head == nullptr) {
return nullptr;
}
if (!cachedNode.count(head)) {//不重复创建结点
Node* headNew = new Node(head->val);
cachedNode[head] = headNew;
headNew->next = copyRandomList(head->next);//线copy next
headNew->random = copyRandomList(head->random);//再copy random
}
/*注意递归函数,可认为执行该函数后已经实现拷贝功能
*1.先拷贝当前结点,然后拷贝next,再拷贝random
*2.为什么不先拷贝random,因为执行拷贝next,其实就相当于新创建了一条只有next的单链表
*/
return cachedNode[head];
}
};
方法二 非递归
参考的解答:参考解答
这位大神还有视频讲解,非常通俗易懂,时间也不长建议看完。看完了也大概可以理解递归的版本了。
class Solution {
public:
unordered_map<Node*, Node*>cacheNode;
Node* copyRandomList(Node* head) {
if (head == nullptr) return nullptr;
Node* copy_head = head;
Node* pre_node = new Node(head->val);
Node* tmp_node = pre_node;
cacheNode[copy_head] = pre_node;
while (copy_head->next) {//第一轮把它看成单链表只拷贝next
Node* next_node = new Node(copy_head->next->val);
pre_node->next = next_node;
pre_node = next_node;
copy_head = copy_head->next;
cacheNode[copy_head] = pre_node;
}
while (head) {//拷贝random
cacheNode[head]->random = cacheNode[head->random];
head = head->next;
}
return tmp_node;
}
};
加油加油!!!!