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 node0
to both nodes1
and2
. - Second node is labeled as
1
. Connect node1
to node2
. - Third node is labeled as
2
. Connect node2
to 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; } HashMapallnodes = 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