The point of this problem is to be calm… So we need a way to record already defined cloned nodes, in both node copy and neighbor(s) copy. Any a way to see if the node in original graph has been processed… which Set is enough… A queue is used to maintain the current work table… … loop solution else… be aware to return the start node when process is empty (check this before add processed not in the set).
/**
* Definition for undirected graph.
* class UndirectedGraphNode {
* int label;
* ArrayList<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> recordNodes = new HashMap<Integer, UndirectedGraphNode>();
Set<UndirectedGraphNode> processed = new HashSet<UndirectedGraphNode>();
Queue<UndirectedGraphNode> process = new LinkedList<UndirectedGraphNode>();
process.offer(node);
UndirectedGraphNode resNode = null;
while(!process.isEmpty()){
UndirectedGraphNode newNode;
if(recordNodes.containsKey(process.peek().label)){
newNode = recordNodes.get(process.peek().label);
newNode.neighbors.clear(); // incase itself is in the neighbor's list.
}else{
newNode = new UndirectedGraphNode(node.label);
recordNodes.put(process.peek().label, newNode);
}
List<UndirectedGraphNode> newNeighbors = new ArrayList<UndirectedGraphNode>();
for(int i = 0; i < process.peek().neighbors.size(); i++){
UndirectedGraphNode newNeighborNode;
if(recordNodes.containsKey(process.peek().neighbors.get(i).label)){
newNeighborNode = recordNodes.get(process.peek().neighbors.get(i).label);
}else{
newNeighborNode = new UndirectedGraphNode(process.peek().neighbors.get(i).label);
recordNodes.put(process.peek().neighbors.get(i).label, newNeighborNode);
}
if(!processed.contains(process.peek().neighbors.get(i))){
process.offer(process.peek().neighbors.get(i));
}
newNeighbors.add(newNeighborNode);
}
newNode.neighbors.addAll(newNeighbors);
if(processed.size() == 0){
resNode = newNode;
}
processed.add(process.poll());
}
return resNode;
}
}
没有评论:
发表评论