题目描述
给定无向连通图中一个节点的引用,返回该图的深拷贝(克隆)。图中的每个节点都包含它的值 val(Int) 和其邻居的列表(list[Node])。
示例:
输出:
{"$ id":“1”,“neighbors”:[{" $ id":“2”,“neighbors”:[{"$ ref":“1”},{"$ id":“3”,“neighbors”:[{" $ ref":“2”},{" $ id":“4”,“neighbors”:[{"$ ref":“3”},{"$ ref":“1”}],“val”:4}],“val”:3}],“val”:2},{"$ref":“4”}],“val”:1}
解释:
节点 1 的值是 1,它有两个邻居:节点 2 和 4 。
节点 2 的值是 2,它有两个邻居:节点 1 和 3 。
节点 3 的值是 3,它有两个邻居:节点 2 和 4 。
节点 4 的值是 4,它有两个邻居:节点 1 和 3 。
题解
使用哈希表+深度搜索求解
class Solution {
//深拷贝时,指向是双向的,用map记录已构造的结点即可,不然就是没完没了的递归了
//简单思考一下:因为图是循环的,会回到起点不停循环,所以代码里只有递归的话,肯定是错的,所以必须有个打破递归的地方
HashMap<Integer,Node> map=new HashMap<Integer,Node>();
public Node cloneGraph(Node node) {
if(node==null) return null;
List<Node> list=new ArrayList<>();
//构造在前
Node now=new Node(node.val,new ArrayList<>());
map.put(node.val,now);
for(int i=0;i<node.neighbors.size();i++){
Node t=node.neighbors.get(i);
if(map.containsKey(t.val)){//打破递归的地方
list.add(map.get(t.val));
}else{
Node tmp=cloneGraph(t);
map.put(tmp.val,tmp);
list.add(tmp);
}
}
//再去修改
now.neighbors=list;
return now;
}
}