Clone Graph(克隆图)

Clone Graph

/**
 * Definition for undirected graph.
 * class UndirectedGraphNode {
 * int label;
 * ArrayList neighbors;
 * UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList(); }
 * };
 */


public class Solution {
    /*
     * @param node: A undirected graph node
     * @return: A undirected graph node
     */
    public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
        // write your code here
        if (node == null) {
            return node;
        }
        //通过map来存储对应关系,key为原来的,value为新的
        Map map = new HashMap<>();
        UndirectedGraphNode res = new UndirectedGraphNode(node.label);
        map.put(node, res);
        //通过队列来添加所有的老元素,首先把第一个加进去。然后从队首移除,移除的同时它的neighbors加入到队列中。加的时候同时加入map,
        // 如果map中已经有了,表明它已经加入到了队列,它的neighbors一定会被遍历到,所以不需要加入。
        LinkedList queue = new LinkedList<>();
        queue.add(node);
        while (!queue.isEmpty()) {
            UndirectedGraphNode first = queue.removeFirst();
            if (first.neighbors != null) {
                for (UndirectedGraphNode temp : first.neighbors) {
                    if (!map.containsKey(temp)) {
                        queue.add(temp);
                        map.put(temp, new UndirectedGraphNode(temp.label));
                    }
                }
            }
        }
        //遍历事个map把给新元素的neighbors赋值
        for (UndirectedGraphNode key : map.keySet()) {
            UndirectedGraphNode val = map.get(key);
            if (key.neighbors != null) {
                val.neighbors = new ArrayList<>();
                for (UndirectedGraphNode temp : key.neighbors) {
                    val.neighbors.add(map.get(temp));
                }
            }
        }
        return res;
    }
}

你可能感兴趣的:(Clone Graph(克隆图))