他會給一個無向連通圖 (undirected graph)的節點 node,每個節點都有一個 val(節點值)和neighbors(鄰居列表)。
接著他要求我回傳整張圖的深拷貝 (deep copy)。
就是要建立一張新的圖,每個節點和邊都要全新複製,但結構完全相同。
那圖中他可能會有環,所以要避免重複建立節點,然後會用DFS搭配一個visited映射表記錄原節點->克隆節點,visited的作用就是用來處理環,避免無限遞迴的,之後每建立一個新節點時,就把它放進visited裡面,下次再遇到同一個原節點時,就直接使用已建立好的克隆節點。
/*
// 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;
}
}
*/
class Solution {
private Node[] visited = new Node[101]; // 紀錄是否已克隆過 (題目: val ≤ 100)
public Node cloneGraph(Node node) {
if (node == null) return null;
Node copy = new Node(node.val); // 建立起始節點
visited[node.val] = copy; // 登記克隆關係
dfs(node, copy); // DFS 深拷貝所有鄰居
return copy;
}
private void dfs(Node orig, Node clone) {
for (Node nei : orig.neighbors) {
if (visited[nei.val] == null) { // 還沒克隆過
Node newNode = new Node(nei.val);
visited[nei.val] = newNode;
clone.neighbors.add(newNode);
dfs(nei, newNode);
} else {
clone.neighbors.add(visited[nei.val]); // 已克隆過,直接連接
}
}
}
}
程式碼引用:
https://leetcode.com/problems/clone-graph/solutions/7243746/simple-java-solution