LeetCode 133: Clone Graph
思路
- 需要考虑自环和两个节点有多条边的特殊情况,这种情况下,不能生成新的节点,而是引用已有节点;
- 利用Hashtable记录已经存放的节点;
代码
import java.util.Hashtable;
public class Solution {
public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
if (node == null) return null;
UndirectedGraphNode begin = new UndirectedGraphNode(node.label);
Queue<UndirectedGraphNode> oldQueue = new LinkedList<UndirectedGraphNode>();
Queue<UndirectedGraphNode> copyQueue = new LinkedList<UndirectedGraphNode>();
oldQueue.add(node);
copyQueue.add(begin);
Hashtable<Integer, UndirectedGraphNode> hashtable = new Hashtable<Integer, UndirectedGraphNode>();
hashtable.put(node.label, begin);
while(!oldQueue.isEmpty()) {
UndirectedGraphNode old = oldQueue.remove();
UndirectedGraphNode copy = copyQueue.remove();
for (UndirectedGraphNode tmp : old.neighbors) {
if (hashtable.containsKey(tmp.label)) {
copy.neighbors.add(hashtable.get(tmp.label));
} else {
UndirectedGraphNode n = new UndirectedGraphNode(tmp.label);
copy.neighbors.add(n);
hashtable.put(tmp.label, n);
oldQueue.add(tmp);
copyQueue.add(n);
}
}
}
return begin;
}
}