题目
给定无向连通图中一个节点的引用,返回该图的深拷贝(克隆)。图中的每个节点都包含它的值 val(Int) 和其邻居的列表(list[Node])
示例:
思路
深拷贝的核心是new一个新的节点出来,为其分配空间,而不仅仅是赋值
用hashmap记录原node 和 新node的对应关系。若原node已经作为key存在于hashmap里,那么说明它的拷贝(新node)也已经存在,直接获得它的拷贝,否则,就要为这个node生成新的拷贝然后,把拷贝放入hashmap中,并且使得拷贝(新node)的邻接链表添加原node的邻接链表里元素的拷贝。
public class cloneGraph {
HashMap<Node,Node> visited=new HashMap<>();// 该语句必须放在方法体外,因为方法体内又递归调用,会造成死循环
public Node cloneGraph(Node node) {
if(node==null) {
return null;
}
if(visited.containsKey(node)) { //如果该节点已经访问过,直接获取该节点
return visited.get(node);
}else {
Node newNode=new Node(node.val); //否则,创建新的节点
visited.put(node, newNode); //讲该节点标记为已访问
if(node.neighbors!=null) { //如果该节点有邻居节点
for(Node nn:node.neighbors) {//遍历邻居节点
newNode.neighbors.add(cloneGraph(nn)); //往邻居节点中添加新的邻居
}
}
return newNode;
}
}
}