clone graph


Clone Graph

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public UndirectedGraphNode (UndirectedGraphNode node) {
if (node == null)
return node;
HashMap<UndirectedGraphNode, UndirectedGraphNode> map = new HashMap<>();
Queue<UndirectedGraphNode> q = new LinkedList<UndirectedGraphNode>();
map.put(node, new UndirectedGraphNode(node.label));
q.offer(node);
while (!q.isEmpty()) {
UndirectedGraphNode cur = q.poll();
for (UndirectedGraphNode n : cur.neighbors) {
if (map.containsKey(n))
continue;
map.put(n, new UndirectedGraphNode(n.label));
q.offer(n);
}
}
q.offer(node);
HashSet<UndirectedGraphNode> set = new HashSet<>();
set.add(node);
while (!q.isEmpty()) {
UndirectedGraphNode cur = q.poll();
UndirectedGraphNode newNode = map.get(cur);
for (UndirectedGraphNode n : cur.neighbors) {
newNode.neighbors.add(map.get(n));
if (set.contains(n))
continue;
set.add(n);
q.offer(n);
}
}
return map.get(node);
}

第二次遍历图的另一种写法, 我是每次都记不住这个Entry的用法啊!!

1
2
3
4
5
6
7
8

for (Map.Entry<UndirectedGraphNode, UndirectedGraphNode> entry : map.entrySet()) {
UndirectedGraphNode element = entry.getKey();
for (UndirectedGraphNode neighbor : element.neighbors) {
map.get(element).neighbors.add(map.get(neighbor));
}
}
return map.get(node);