https://leetcode-cn.com/problems/clone-graph/
题目描述
题解
跟复杂链表的复制优点类似,不过这里需要遍历图的所有邻居。最后同样都需要将已经遍历过的节点存入哈希表中。
/*
// Definition for a Node.
class Node {
public int val;
public List<Node> neighbors;
public Node() {
val = 0;
neighbors = new ArrayList<Node>();
}
public Node(int _val) {
val = _val;
neighbors = new ArrayList<Node>();
}
public Node(int _val, ArrayList<Node> _neighbors) {
val = _val;
neighbors = _neighbors;
}
}
*/
class Solution {
// map {old : new}
private Map<Node, Node> seen = new HashMap<Node, Node>();
public Node cloneGraph(Node node) {
// 如果节点是空的话,直接返回null
if(node == null) return null;
// 创建新节点
Node newNode = new Node(node.val);
// 将当前节点放入seen中
seen.put(node, newNode);
// 遍历旧节点的邻居
for(Node n:node.neighbors){
// 如果没有访问过就去dfs
if(!seen.containsKey(n)){
cloneGraph(n);
}
// 现在在hash表中,有所有的旧节点的邻居,所以直接在新节点的邻居里头添加即可
newNode.neighbors.add(seen.get(n));
}
return newNode;
}
}