[LintCode]Clone Graph
/**
* Definition for undirected graph.
* class UndirectedGraphNode {
* int label;
* ArrayList<UndirectedGraphNode> neighbors;
* UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); }
* };
*/
public class Solution {
/**
* @param node: A undirected graph node
* @return: A undirected graph node
*/
public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
// 2015-07-01
if (node == null) {
return null;
}
HashMap<UndirectedGraphNode, UndirectedGraphNode> map = new HashMap<>();
ArrayList<UndirectedGraphNode> nodes = new ArrayList<>();
// step 1 遍历图,开辟内存,建立哈希表,新旧节点一一对应
nodes.add(node);
map.put(node, new UndirectedGraphNode(node.label));
for (int i = 0; i < nodes.size(); i++) {
UndirectedGraphNode head = nodes.get(i);
int len = head.neighbors.size();
for (int j = 0; j < len; j++) {
UndirectedGraphNode neighbor = head.neighbors.get(j);
if (!map.containsKey(neighbor)) {
nodes.add(neighbor);
map.put(neighbor, new UndirectedGraphNode(neighbor.label));
}
}
}
// step 2 遍历哈希表,为每一个新的节点添加neighbors
int len = nodes.size();
for (int i = 0; i < len; i++) {
UndirectedGraphNode oldNode = nodes.get(i);
UndirectedGraphNode newNode = map.get(oldNode);
for (int j = 0; j < oldNode.neighbors.size(); j++) {
newNode.neighbors.add(map.get(oldNode.neighbors.get(j)));
}
}
return map.get(node);
}
}