Clone an undirected graph. Each node in the graph contains a
label
and a list of its
neighbors
.
OJ's undirected graph serialization:
Nodes are labeled uniquely.
We use
#
as a separator for each node, and
,
as a separator for node label and each neighbor of the node.
As an example, consider the serialized graph
{0,1,2#1,2#2,2}
.
The graph has a total of three nodes, and therefore contains three parts as separated by
#
.
- First node is labeled as
0
. Connect node 0
to both nodes 1
and 2
.
- Second node is labeled as
1
. Connect node 1
to node 2
.
- Third node is labeled as
2
. Connect node 2
to node 2
(itself), thus forming a self-cycle.
Visually, the graph looks like the following:
1
/ \
/ \
0 --- 2
/ \
\_/
解题思路:
无向图的邻居,要注意避免重复建设node. 所以我们用一个hashmap来存储已经有的点。当遇到了已经有的点,直接从hahmap里取。
Java Code:
public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
if(node == null){
return null;
}
HashMap allnodes = new HashMap();
List newnodes= new ArrayList();
List oldnodes= new ArrayList();
UndirectedGraphNode newNode = new UndirectedGraphNode(node.label);
allnodes.put(node.label, newNode);
newnodes.add(newNode);
oldnodes.add(node);
do{
List newNext= new ArrayList();
List oldNext= new ArrayList();
for(int i = 0; i < oldnodes.size(); i++){
UndirectedGraphNode oldnode = oldnodes.get(i);
if(oldnode.neighbors == null){
continue;
}
List oldneibors = oldnode.neighbors;
List newneibors = new ArrayList();
for(UndirectedGraphNode curr : oldneibors){
UndirectedGraphNode newnode = null;
if(allnodes.containsKey(curr.label)){
newnode = allnodes.get(curr.label);
}else{
newnode = new UndirectedGraphNode(curr.label);
allnodes.put(curr.label, newnode);
newNext.add(newnode);
oldNext.add(curr);
}
newneibors.add(newnode);
}
newnodes.get(i).neighbors = newneibors;
}
oldnodes = oldNext;
newnodes = newNext;
}while(!oldnodes.isEmpty());
return newNode;
}