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 node0to both nodes1and2. - Second node is labeled as
1. Connect node1to node2. - Third node is labeled as
2. Connect node2to node2(itself), thus forming a self-cycle.
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;
}
No comments:
Post a Comment