題目描述
給你無向 連通 圖中一個節點的引用,請你返回該圖的 深拷貝(克隆)。
圖中的每個節點都包含它的值 val(int) 和其鄰居的列表(list[Node])。
class Node {
public int val;
public List<Node> neighbors;
}
測試用例格式:
簡單起見,每個節點的值都和它的索引相同。例如,第一個節點值爲 1(val = 1),第二個節點值爲 2(val = 2),以此類推。該圖在測試用例中使用鄰接列表表示。
鄰接列表 是用於表示有限圖的無序列表的集合。每個列表都描述了圖中節點的鄰居集。
給定節點將始終是圖中的第一個節點(值爲 1)。你必須將 給定節點的拷貝 作爲對克隆圖的引用返回。
輸入:adjList = [[2,4],[1,3],[2,4],[1,3]]
輸出:[[2,4],[1,3],[2,4],[1,3]]
解釋:
圖中有 4 個節點。
節點 1 的值是 1,它有兩個鄰居:節點 2 和 4 。
節點 2 的值是 2,它有兩個鄰居:節點 1 和 3 。
節點 3 的值是 3,它有兩個鄰居:節點 2 和 4 。
節點 4 的值是 4,它有兩個鄰居:節點 1 和 3 。
示例 2:
提示:
節點數不超過 100 。
每個節點值 Node.val 都是唯一的,1 <= Node.val <= 100。
無向圖是一個簡單圖,這意味着圖中沒有重複的邊,也沒有自環。
由於圖是無向的,如果節點 p 是節點 q 的鄰居,那麼節點 q 也必須是節點 p 的鄰居。
圖是連通圖,你可以從給定節點訪問到所有節點。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/clone-graph
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
白話題目:
算法:
詳細解釋關注 B站 【C語言全代碼】學渣帶你刷Leetcode 不走丟 https://www.bilibili.com/video/BV1C7411y7gB
C語言完全代碼
struct Node** visited;
struct Node* dfs(struct Node* s){
if(s == NULL){
return NULL;
}
if(visited[s->val]){
return visited[s->val];
}
int i;
struct Node* nd = (struct Node*)malloc(sizeof(struct Node));
nd->val = s->val;
nd->numNeighbors = s->numNeighbors;
visited[nd->val] = nd;
nd->neighbors = (struct Node**)malloc(sizeof(struct Node*)*nd->numNeighbors);
for(i = 0; i < nd->numNeighbors; i++){
nd->neighbors[i] = dfs(s->neighbors[i]);
}
return nd;
}
struct Node *cloneGraph(struct Node *s) {
visited = (struct Node**)malloc(sizeof(struct Node*)*101);
memset(visited, 0, sizeof(struct Node*)*101);
//visited = (struct Node **)calloc(101, sizeof(struct Node*));
//calloc初始化時會自動清理內存,malloc初始化完事後內存空間內爲隨機數據。
return dfs(s);
}