【力扣】133.克隆图(c++)

题目[1]

给你无向 连通 图中一个节点的引用,请你返回该图的深拷贝(克隆)。图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])
class Node {
public int val;
public List neighbors;
}

代码

/*
// Definition for a Node.
class Node {
public:
    int val;
    vector<Node*> neighbors;
    Node() {
        val = 0;
        neighbors = vector<Node*>();
    }
    Node(int _val) {
        val = _val;
        neighbors = vector<Node*>();
    }
    Node(int _val, vector<Node*> _neighbors) {
        val = _val;
        neighbors = _neighbors;
    }
};
*/

class Solution {
private:
    map<Node*,Node*> visited;
public:
    Node* cloneGraph(Node* node) {
        if(!node)return NULL;
        if(visited.count(node))return visited[node];
        else {
            Node *cloneNode =new Node(node->val);
            visited[node]=cloneNode;
            for(Node *n:node->neighbors){
                cloneNode->neighbors.push_back(cloneGraph(n));
            }
            return cloneNode;
        }
    }
};

题解

思路: dfs遍历全图并拷贝到新的结构体中
关键点: 用map存储访问过的路径,避免在环上绕圈圈。
难度: ⭐⭐⭐(难在理解题意)

拓展知识点:

  • 浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址
  • 深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存。
  • 使用深拷贝的情况下,释放内存的时候不会因为出现浅拷贝时释放同一个内存的错误。 [2]

说人话:
深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。

假设B复制了A,修改A的时候,看B是否发生变化:

如果B跟着也变了,说明是浅拷贝,拿人手短!(修改堆内存中的同一个值)

如果B没有改变,说明是深拷贝,自食其力!(修改堆内存中的不同的值)[3]


  1. https://leetcode-cn.com/problems/clone-graph ↩︎

  2. https://www.cnblogs.com/williamjie/p/11192895.html ↩︎

  3. https://www.cnblogs.com/mikeCao/p/8710837.html ↩︎

posted @ 2021-03-09 19:14  edithlee  阅读(29)  评论(0)    收藏  举报