題目地址:
https://leetcode-cn.com/probl...
題目描述:
給定無向連通圖中一個節點的引用,返回該圖的深拷貝(克隆)。圖中的每個節點都包含它的值 val(Int) 和其鄰居的列表(list[Node])。
提示:
節點數介於 1 到 100 之間。
無向圖是一個簡單圖,這意味着圖中沒有重複的邊,也沒有自環。
由於圖是無向的,如果節點 p 是節點 q 的鄰居,那麼節點 q 也必須是節點 p 的鄰居。
必須將給定節點的拷貝作爲對克隆圖的引用返回。
解答:
首先解釋一下,深拷貝的意思是,一個節點,若對它進行深拷貝,那麼必然生成一個新的節點,這個節點的所有的屬性值和原節點相同,但是這兩個節點在內存中是兩個不同的對象,這樣稱之爲深拷貝。
這一題的做法是,使用一個hashmap來記錄,原node 和 新node的對應關係。
若原node已經作爲key存在於hashmap裏,那麼說明它的拷貝(新node)也
已經存在,那麼直接獲得它的拷貝,否則,就要爲這個node生成新的拷貝
然後,把拷貝放入hashmap中,並且使得拷貝(新node)的鄰接鏈表添加原node的鄰接鏈表裏元素的拷貝。
話比較繞,看代碼就懂了!!!
java ac代碼:
/*
// Definition for a Node.
class Node {
public int val;
public List<Node> neighbors;
public Node() {}
public Node(int _val,List<Node> _neighbors) {
val = _val;
neighbors = _neighbors;
}
};
*/
class Solution {
HashMap<Node,Node>map = new HashMap();
public Node cloneGraph(Node node) {
if(node == null)return null;
if(map.containsKey(node))
return map.get(node);
Node newnode = new Node(node.val,null);
map.put(node,newnode);
if(node.neighbors != null){
newnode.neighbors = new ArrayList();
for(Node nn:node.neighbors)
newnode.neighbors.add(cloneGraph(nn));
}
return newnode;
}
}