. 复杂链表的复制

***++题目链接++***

题目介绍:

image.pngimage.png

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;
    
    Node(int _val) {
        val = _val;
        next = NULL;
        random = NULL;
    }
};
*/
class Solution {
    unordered_map<Node*, Node*> map;
public:
    Node* copyRandomList(Node* head) {
        if(!head) return nullptr;
        if(map.find(head) == map.end())
        {
            Node* node = new Node(head->val);
            map[head] = node;
            node->next = copyRandomList(head->next);
            node->random = copyRandomList(head->random);
        }
        return  map[head];
    }
};

题解

  1. 这道题是一道 基于深拷贝 思想的链表题,意味着一定要做到深拷贝,将整个资源copy一份
  2. 特殊的,处理寻常链表具有的 next的指针, 它还有 一个指向 随机的 random的指针
  3. 对于深度拷贝,必然我们要主动 创建每一个节点,才能实现整体的拷贝
  4. 因为具有一个随机的指向, 所以, 为了不 多次的创建某一节点, 我们选择使用一个 单次存储的map来管理创建的资源
  5. -------------------------分割线------------------------------------------------------------
  6. 利用一个map 对需要创建head的拷贝值node时, 进行插入实现管理
  7. 如果已经创建过了,就不需要再做处理, 没有创建的话, 进入
  8. 创建改节点的拷贝,插入, 然后深度拷贝 它的next 节点和 random节点
  9. 因为利用的递归,偏向于深度的一种构建,对于链表来说,就可以说是完成了
  10. 返回值是copy的新的头节点, 即map --> key == head;