思路是这样的:使用 一个 HashMap 记住那个环里面的节点,一旦有深拷贝出新的节点,就立马把信息登记在
hashMap 里面,因此,我把这个 hashMap 理解为一个登记表,用来记录节点的地址
在代码中,我把旧的节点标记为 old,新的节点标记为copy,这样可以方便理解
/*
// 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 {
public Node cloneGraph(Node old) {
if(old==null) return old;
HashMap<Node,Node> table = new HashMap();
return create(table,old);
}
private Node create(Map<Node,Node>map,Node old) {
Node copy = new Node(old.val,new ArrayList(old.neighbors.size()));
map.put(old,copy);
for(Node nextOld: old.neighbors) {
if(map.containsKey(nextOld)) {
copy.neighbors.add(map.get(nextOld));
}else{
Node createdNode = create(map,nextOld);// 可以直接 copy.neighbors.add(createdNode),也可以像下面这句
copy.neighbors.add(createdNode);
}
}
return copy;
}
}
刚才dfs 3ms ,接下来 bfs 4ms,
class Solution {
public Node cloneGraph(Node old) {
HashMap<Node,Node> table = new HashMap();
Deque<Node> q = new LinkedList();
Node copy = new Node(old.val,new ArrayList<Node>());
table.put(old,copy);
q.offer(old);
while(!q.isEmpty()) {
Node curOld = q.poll();
for(Node nextOld:curOld.neighbors) {
if(!table.containsKey(nextOld)) {
table.put(nextOld,new Node(nextOld.val,new ArrayList<Node>()));
q.offer(nextOld);
}
table.get(curOld).neighbors.add(table.get(nextOld));
}
}
return copy;
}
}