题目地址:
https://leetcode-cn.com/probl…
题目描述:
给定无向连通图中一个节点的引用,返回该图的深拷贝(克隆)。图中的每个节点都包含它的值 val(Int)和其邻居的列表(list[Node])。
提示:
节点数介于 1 到 100 之间。
无向图是一个简单图,这意味着图中没有重复的边,也没有自环。
由于图是无向的,如果节点 p 是节点 q 的邻居,那么节点 q 也必须是节点 p 的邻居。
必须将给定节点的拷贝作为对克隆图的引用返回。
解答:
首先解释一下,深拷贝的意思是,一个节点,若对它进行深拷贝,那么必然生成一个新的节点,这个节点的所有的属性值和原节点相同,但是这两个节点在内存中是两个不同的对象,这样称之为深拷贝。
这一题的做法是,使用一个 hashmap 来记录,原 node 和 新 node 的对应关系。
若原 node 已经作为 key 存在于 hashmap 里,那么说明它的拷贝 (新 node) 也
已经存在,那么直接获得它的拷贝,否则,就要为这个 node 生成新的拷贝
然后,把拷贝放入 hashmap 中,并且使得拷贝 (新 node) 的邻接链表添加原 node 的邻接链表里元素的拷贝。
话比较绕,看代码就懂了!!!
java ac 代码:
/*
// Definition for a Node.
class Node {
public int val;
public List<Node> neighbors;
public Node() {}
public Node(int _val,List<Node> _neighbors) {
val = _val;
neighbors = _neighbors;
}
};
*/
class Solution {HashMap<Node,Node>map = new HashMap();
public Node cloneGraph(Node node) {if(node == null)return null;
if(map.containsKey(node))
return map.get(node);
Node newnode = new Node(node.val,null);
map.put(node,newnode);
if(node.neighbors != null){newnode.neighbors = new ArrayList();
for(Node nn:node.neighbors)
newnode.neighbors.add(cloneGraph(nn));
}
return newnode;
}
}