news 2026/5/1 21:23:45

133. 克隆图(Clone Graph)——C语言实现深拷贝

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
133. 克隆图(Clone Graph)——C语言实现深拷贝

题目描述

给你无向连通图中一个节点的引用,请你返回该图的深拷贝(克隆)。
图中的每个节点都包含它的值val和其邻居的列表neighbors

  • 节点类定义:

struct Node { int val; int numNeighbors; struct Node** neighbors; };
  • 测试用例格式:

    • 节点的值和索引相同,方便测试。

    • 邻接列表表示图。

示例:

输入:adjList = [[2,4],[1,3],[2,4],[1,3]] 输出:[[2,4],[1,3],[2,4],[1,3]]

提示:

  • 节点数量在 [0,100]。

  • 1 <= Node.val <= 100,唯一。

  • 无重复边和自环。

  • 图是连通的。


解题思路

本题可以抽象为“图的深拷贝”问题
由于是无向图,克隆过程中需要注意避免重复创建节点,否则会进入无限递归。

核心思路:

  1. 图遍历:可以使用 DFS 或 BFS。

  2. 哈希表记录已克隆节点:避免重复创建。这里题目给出val范围 [1,100],所以可以用数组模拟哈希表。

  3. 深拷贝节点及其邻居:递归/队列遍历。


DFS 实现(C语言)

核心函数

#include <stdlib.h> // DFS 克隆 struct Node* dfs(struct Node* node, struct Node** visited) { if (node == NULL) return NULL; // 如果已经克隆过,直接返回 if (visited[node->val] != NULL) { return visited[node->val]; } // 创建新节点 struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->val = node->val; newNode->numNeighbors = node->numNeighbors; newNode->neighbors = (struct Node**)malloc(sizeof(struct Node*) * node->numNeighbors); // 记录映射 visited[node->val] = newNode; // 递归克隆所有邻居 for (int i = 0; i < node->numNeighbors; i++) { newNode->neighbors[i] = dfs(node->neighbors[i], visited); } return newNode; }

主函数

struct Node *cloneGraph(struct Node *s) { if (s == NULL) return NULL; // 使用数组作为哈希表(val 范围 1~100) struct Node* visited[101] = {0}; return dfs(s, visited); }

示例解析

以输入[[2,4],[1,3],[2,4],[1,3]]为例:

原图结构:

1 -- 2 | | 4 -- 3

DFS 克隆过程:

  1. 克隆节点 1

  2. 遍历邻居 2 → 克隆 2

  3. 2 的邻居 1 已经克隆 → 直接引用

  4. 遍历邻居 3 → 克隆 3

  5. 遍历邻居 4 → 克隆 4

  6. 4 的邻居 1、3 已经克隆 → 直接引用

  7. 完成克隆

最终得到一个深拷贝图。


时间复杂度与空间复杂度

  • 时间复杂度:O(N + E)

    • 每个节点和每条边只访问一次

  • 空间复杂度:O(N)

    • 递归栈 + 哈希表(visited)存储


注意点

  1. 必须使用 visited 数组,防止重复创建节点导致无限递归。

  2. 先记录 visited 再递归克隆邻居,保证引用正确。

  3. neighbors 指针数组必须分配内存

newNode->neighbors = malloc(sizeof(struct Node*) * node->numNeighbors);
  1. 空图或单节点图需要特殊处理:

if (s == NULL) return NULL;

总结

  • 这题是图的深拷贝,本质是DFS/BFS + 哈希表映射

  • DFS 简洁,BFS 更适合面试考察队列实现。

  • C语言实现要注意内存分配和避免重复创建节点。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/10 22:27:51

5步掌握网盘直链下载助手:告别限速烦恼的终极解决方案

5步掌握网盘直链下载助手&#xff1a;告别限速烦恼的终极解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼…

作者头像 李华
网站建设 2026/4/10 22:27:47

KMS_VL_ALL_AIO终极指南:3分钟实现Windows与Office智能激活

KMS_VL_ALL_AIO终极指南&#xff1a;3分钟实现Windows与Office智能激活 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO KMS_VL_ALL_AIO是一款功能强大的智能激活脚本工具&#xff0c;专为Window…

作者头像 李华
网站建设 2026/4/10 22:25:09

PyCharm 强强联手:2026 年本地 IDE 连接 AI 的全攻略 (DeepSeek/Copilot/GPT)

前言 在 AI 大模型爆发的今天&#xff0c;如果你的 PyCharm 还只是个“单纯的编辑器”&#xff0c;那真的太可惜了。通过在 PyCharm 中集成 AI 助手&#xff0c;我们可以实现自动补全代码、一键生成单元测试、快速修复 Bug。本文将带你实操三种最主流的集成方式&#xff0c;让…

作者头像 李华
网站建设 2026/4/10 22:17:07

LLM推理微服务基准测试全链路指南,从Prompt扰动控制到P99延迟归因分析

第一章&#xff1a;AI原生软件研发性能基准测试方法 2026奇点智能技术大会(https://ml-summit.org) AI原生软件的研发范式正从“AI增强应用”转向“以模型为一等公民”的系统架构&#xff0c;其性能基准测试需同步重构——不再仅关注延迟与吞吐量&#xff0c;更要量化模型推理…

作者头像 李华
网站建设 2026/4/10 22:15:14

暗黑3技能连点器终极指南:三步解决重复操作难题

暗黑3技能连点器终极指南&#xff1a;三步解决重复操作难题 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面&#xff0c;可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 还在为暗黑3中重复的技能按键感到疲惫吗&…

作者头像 李华