云计算百科
云计算领域专业知识百科平台

27-总结与实战

C语言数据结构系列:总结与实战篇

  • C语言数据结构系列(二十七):总结与实战
    • 一、前言
    • 二、系列回顾
      • 2.1 线性结构
      • 2.2 树形结构
      • 2.3 图结构
      • 2.4 排序算法
      • 2.5 查找算法
    • 三、LeetCode高频题实战
      • 3.1 数组
      • 3.2 链表
      • 3.3 栈
      • 3.4 树
      • 3.5 图
      • 3.6 排序
      • 3.7 动态规划
    • 四、进阶学习路线
      • 4.1 进阶数据结构
      • 4.2 算法进阶
      • 4.3 系统设计
    • 五、学习建议
      • 5.1 刷题建议
      • 5.2 学习方法
    • 六、系列完结
      • 6.1 目录
      • 6.2 寄语
    • 七、最后的话

C语言数据结构系列(二十七):总结与实战

🎯 本篇目标:回顾整个系列,实战LeetCode高频题! 📌 摘要:本文是 C 语言数据结构系列的收官之作,系统回顾了线性结构(数组、链表、栈、队列)、树形结构(二叉树、BST、堆、AVL、红黑树)、图结构(DFS、BFS、最小生成树、最短路径)、排序与查找算法,并精选 7 道 LeetCode 高频题(两数之和、反转链表、有效的括号、二叉树最大深度、岛屿数量、合并有序数组、爬楼梯)给出 C 语言实现。最后给出进阶学习路线与刷题建议,帮助读者完成从理论到实战的闭环。


一、前言

哈喽小伙伴们!👋

恭喜大家学完了整个数据结构系列!🎉

今天我们来:

  • 📋 回顾总结所有内容
  • 💪 实战演练经典题目
  • 🚀 进阶建议后续学习路线

  • 二、系列回顾

    2.1 线性结构

    数据结构特点核心操作应用
    数组 连续存储 随机访问O(1) 基础存储
    链表 离散存储 插入删除O(1) 动态数据
    LIFO push/pop 括号匹配
    队列 FIFO enqueue/dequeue BFS

    2.2 树形结构

    数据结构特点时间复杂度应用
    二叉树 两个孩子 O(n) 基础结构
    BST 左<根<右 O(logn) 查找
    完全二叉树 O(logn) 优先队列
    AVL 严格平衡 O(logn) 查找密集
    红黑树 近似平衡 O(logn) 通用

    2.3 图结构

    算法用途时间复杂度
    DFS 深度遍历 O(V+E)
    BFS 广度遍历 O(V+E)
    Prim 最小生成树 O(V²)
    Kruskal 最小生成树 O(ElogE)
    Dijkstra 最短路径 O(V²)
    Floyd 全源最短路 O(V³)

    2.4 排序算法

    算法平均最坏稳定适用
    冒泡 O(n²) O(n²) 教学
    选择 O(n²) O(n²) 教学
    插入 O(n²) O(n²) 小数据
    快排 O(nlogn) O(n²) 通用
    归并 O(nlogn) O(nlogn) 稳定排序
    堆排 O(nlogn) O(nlogn) TopK
    计数 O(n+k) O(k) 小范围整数

    2.5 查找算法

    算法时间适用
    顺序查找 O(n) 无序
    二分查找 O(logn) 有序
    哈希表 O(1)* 通用
    并查集 O(α(n)) 集合合并

    三、LeetCode高频题实战

    3.1 数组

    题目1:两数之和

    int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
    int *result = (int*)malloc(2 * sizeof(int));
    *returnSize = 2;

    for (int i = 0; i < numsSize; i++) {
    for (int j = i + 1; j < numsSize; j++) {
    if (nums[i] + nums[j] == target) {
    result[0] = i;
    result[1] = j;
    return result;
    }
    }
    }
    return result;
    }

    3.2 链表

    题目2:反转链表

    struct ListNode* reverseList(struct ListNode* head) {
    struct ListNode *prev = NULL, *curr = head;
    while (curr) {
    struct ListNode *next = curr->next;
    curr->next = prev;
    prev = curr;
    curr = next;
    }
    return prev;
    }

    3.3 栈

    题目3:有效的括号

    bool isValid(char * s) {
    char stack[5000];
    int top = 1;

    while (*s) {
    if (*s == '(' || *s == '[' || *s == '{') {
    stack[++top] = *s;
    } else {
    if (top == 1) return false;
    if (*s == ')' && stack[top] != '(') return false;
    if (*s == ']' && stack[top] != '[') return false;
    if (*s == '}' && stack[top] != '{') return false;
    top;
    }
    s++;
    }
    return top == 1;
    }

    3.4 树

    题目4:二叉树的最大深度

    int maxDepth(struct TreeNode* root) {
    if (!root) return 0;
    int left = maxDepth(root->left);
    int right = maxDepth(root->right);
    return (left > right ? left : right) + 1;
    }

    3.5 图

    题目5:岛屿数量

    void dfs(char** grid, int i, int j, int gridSize, int colSize) {
    if (i < 0 || i >= gridSize || j < 0 || j >= colSize) return;
    if (grid[i][j] != '1') return;

    grid[i][j] = '0';
    dfs(grid, i+1, j, gridSize, colSize);
    dfs(grid, i1, j, gridSize, colSize);
    dfs(grid, i, j+1, gridSize, colSize);
    dfs(grid, i, j1, gridSize, colSize);
    }

    int numIslands(char** grid, int gridSize, int* gridColSize) {
    int count = 0;
    int colSize = gridColSize[0];

    for (int i = 0; i < gridSize; i++) {
    for (int j = 0; j < colSize; j++) {
    if (grid[i][j] == '1') {
    dfs(grid, i, j, gridSize, colSize);
    count++;
    }
    }
    }
    return count;
    }

    3.6 排序

    题目6:合并两个有序数组

    void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    int i = m 1, j = n 1, k = m + n 1;
    while (i >= 0 && j >= 0) {
    if (nums1[i] > nums2[j])
    nums1[k] = nums1[i];
    else
    nums1[k] = nums2[j];
    }
    while (j >= 0)
    nums1[k] = nums2[j];
    }

    3.7 动态规划

    题目7:爬楼梯

    int climbStairs(int n) {
    if (n <= 2) return n;
    int dp[n + 1];
    dp[1] = 1;
    dp[2] = 2;
    for (int i = 3; i <= n; i++) {
    dp[i] = dp[i1] + dp[i2];
    }
    return dp[n];
    }


    四、进阶学习路线

    4.1 进阶数据结构

    • 🔴 B树/B+树
    • 🔴 跳表
    • 🔴 图数据库
    • 🔴 布隆过滤器

    4.2 算法进阶

    • 🔴 动态规划专题
    • 🔴 贪心算法
    • 🔴 回溯算法
    • 🔴 分治算法

    4.3 系统设计

    • 🔴 分布式系统
    • 🔴 数据库设计
    • 🔴 缓存设计

    五、学习建议

    5.1 刷题建议

  • LeetCode 📚

    • 按标签刷
    • 先易后难
    • 总结模板
  • 牛客网 🐮

    • 面试真题
    • 模拟面试
  • 5.2 学习方法

  • 理解原理 📖

    • 画图理解
    • 手动模拟
  • 多写代码 💻

    • 不看答案写
    • 优化时间空间
  • 总结模板 📝

    • 常用数据结构
    • 常用算法

  • 六、系列完结

    6.1 目录

    序号标题
    01 数组:从入门到精通
    02 单链表完全指南
    03 双链表与循环链表
    04 栈:后进先出的奥秘
    05 队列:先进先出的艺术
    06 串:字符串处理全攻略
    07 二叉树入门:概念与存储
    08 二叉树遍历:四种方式详解
    09 二叉搜索树:高效查找
    10 堆:优先队列的实现
    11 哈夫曼树:最优编码
    12 平衡二叉树:AVL与红黑树
    13 图的基础:存储与表示
    14 图的遍历:DFS与BFS
    15 最小生成树:Prim与Kruskal
    16 最短路径:Dijkstra与Floyd
    17 拓扑排序与关键路径
    18 排序基础:冒泡与选择
    19 插入排序与希尔排序
    20 快速排序:分治经典
    21 归并排序:稳定高效
    22 堆排序:原地排序
    23 非比较排序:计数、基数、桶
    24 查找算法:从顺序到二分
    25 哈希表:O(1)查找的秘密
    26 并查集:集合合并
    27 总结与实战

    6.2 寄语

    💡 数据结构是编程的内功,算法是招式。内功深厚,招式才能发挥威力!

    坚持学习,你一定能成为优秀的程序员! 🚀


    七、最后的话

    感谢大家陪伴这个系列!如果觉得有帮助:

    • 👍 点赞支持
    • ⭐ 收藏复习
    • 👤 关注获取更多
    • 💬 评论交流讨论

    我们下个系列再见! 👋


    💡 数据结构学完了,但编程之路才刚刚开始!继续加油!🚀

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 27-总结与实战
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!