题目
Clone an undirected graph. Each node in the graph contains a
label
and a list of itsneighbors
.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.Visually, the graph looks like the following:
1 / / 0 --- 2 / \_/
方法
主要分两步:第一步创建全部的结点。第二步,创建结点的neighbors/** * Definition for undirected graph. * class UndirectedGraphNode { * int label; * List<UndirectedGraphNode> neighbors; * UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); } * }; */ public class Solution { public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) { if (node == null) { return null; } Map<Integer, UndirectedGraphNode> map = new HashMap<Integer, UndirectedGraphNode>(); Map<Integer, UndirectedGraphNode> graph = new HashMap<Integer, UndirectedGraphNode>(); Queue<UndirectedGraphNode> queue = new LinkedList<UndirectedGraphNode>(); queue.offer(node); while(!queue.isEmpty()) { UndirectedGraphNode temp = queue.poll(); if (!map.containsKey(temp.label)) { UndirectedGraphNode newTemp = new UndirectedGraphNode(temp.label); graph.put(temp.label, temp); map.put(temp.label, newTemp); } for (UndirectedGraphNode neighbor : temp.neighbors) { if (!map.containsKey(neighbor.label)) { queue.offer(neighbor); } } } for (int label : graph.keySet()) { UndirectedGraphNode temp = graph.get(label); UndirectedGraphNode cloneTemp = map.get(temp.label); for (UndirectedGraphNode neighbor : temp.neighbors) { cloneTemp.neighbors.add(map.get(neighbor.label)); } } return map.get(node.label); } }