[133. 克隆图]

[133. 克隆图]

给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。

图中的每个节点都包含它的值 valint) 和其邻居的列表(list[Node])。

class Node {
    public int val;
    public List<Node> neighbors;
}

测试用例格式:

简单起见,每个节点的值都和它的索引相同。例如,第一个节点值为 1(val = 1),第二个节点值为 2(val = 2),以此类推。该图在测试用例中使用邻接列表表示。

邻接列表 是用于表示有限图的无序列表的集合。每个列表都描述了图中节点的邻居集。

给定节点将始终是图中的第一个节点(值为 1)。你必须将 给定节点的拷贝 作为对克隆图的引用返回。

public class Q133 {
// Definition for a Node.
    class Node {
        public int val;
        public List<Node> neighbors;

        public Node() {
            val = 0;
            neighbors = new ArrayList<Node>();
        }

        public Node(int _val) {
            val = _val;
            neighbors = new ArrayList<Node>();
        }

        public Node(int _val, ArrayList<Node> _neighbors) {
            val = _val;
            neighbors = _neighbors;
        }
    }

    public Node cloneGraph(Node node) {

        HashMap<Node, Node> map = new HashMap<>();
        map.put(node, new Node(node.val, new ArrayList<>()));
        Queue<Node> q = new LinkedList<Node> ();
        q.add(node);

        while (!q.isEmpty()) {
            Node tmp  = q.poll();
            Node newtmp = map.get(tmp);

            for (Node node1 : tmp.neighbors) {

                if(!map.containsKey(node1)) {
                    map.put(node1, new Node(node1.val));
                    //注意这里要传入的是原节点而不是克隆节点
                    q.add(node1);
                }
                newtmp.neighbors.add(map.get(node1));
            }

        }

        return map.get(node);

    }

}
posted @ 2020-08-12 13:18  IzuruKamuku  阅读(67)  评论(0编辑  收藏  举报