目录
一、专栏知识图谱
二、面试高频手撕代码题
2.1 线性表(必考)
2.2 栈与队列
2.3 二叉树
2.4 排序与查找
2.5 动态规划
2.6 图论
2.7 其他高频题
三、大厂面试常考知识点
3.1 必须掌握
3.2 加分项
四、学习进阶建议
4.1 下一步学什么
4.2 推荐书籍
4.3 刷题建议
五、专栏寄语
六、附录:常用复杂度速查表
一、专栏知识图谱
text
数据结构与算法(C语言实现) │ ├── 基础篇 │ ├── 时间复杂度/空间复杂度 │ ├── 指针、结构体、动态内存 │ └── 递归本质(系统栈) │ ├── 线性结构 │ ├── 顺序表(动态数组) │ ├── 单链表(头插、尾插、反转、快慢指针) │ ├── 双向链表 │ ├── 循环链表(约瑟夫环) │ └── 静态链表(游标实现) │ ├── 受限线性表 │ ├── 栈(顺序栈、链式栈) │ │ └── 应用:括号匹配、表达式求值 │ └── 队列(循环队列、链式队列) │ └── 应用:BFS │ ├── 串与数组 │ ├── 串匹配(BF、KMP) │ └── 矩阵压缩(对称、三角、稀疏) │ ├── 树形结构 │ ├── 二叉树(遍历、重构) │ ├── 线索二叉树 │ ├── 树/森林与二叉树转换 │ ├── 哈夫曼树与编码 │ ├── 二叉排序树(BST) │ ├── 平衡二叉树(AVL) │ └── 红黑树(原理) │ ├── 查找算法 │ ├── 静态查找(顺序、折半、插值、斐波那契) │ └── 哈希表(链地址法、开放地址法) │ ├── 排序算法 │ ├── O(n²):冒泡、选择、插入 │ ├── O(n log n):快排、归并、堆排、希尔 │ └── O(n):计数、基数、桶 │ ├── 图论 │ ├── 存储(邻接矩阵、邻接表) │ ├── 遍历(DFS、BFS) │ ├── 最小生成树(Prim、Kruskal) │ ├── 最短路径(Dijkstra、Floyd) │ └── 拓扑排序、关键路径 │ ├── 高级数据结构 │ ├── 并查集(路径压缩、按秩合并) │ ├── 堆(优先队列) │ ├── Trie树(前缀树) │ └── 跳跃表(Skip List) │ └── 算法思想 ├── 递归与分治(汉诺塔、归并排序) ├── 动态规划(背包、LCS) └── 贪心算法(活动选择、找零)
二、面试高频手撕代码题
2.1 线性表(必考)
| 题目 | 难度 | 核心技巧 |
|---|---|---|
| 反转单链表 | ⭐⭐ | 三指针迭代 / 递归 |
| 链表中环的检测 | ⭐⭐ | 快慢指针 |
| 合并两个有序链表 | ⭐⭐ | 递归 / 迭代 |
| 删除链表倒数第N个节点 | ⭐⭐⭐ | 快慢指针(先走N步) |
| 找到链表的中间节点 | ⭐⭐ | 快慢指针 |
| 判断回文链表 | ⭐⭐⭐ | 快慢指针找中点 + 反转后半 |
2.2 栈与队列
| 题目 | 难度 | 核心技巧 |
|---|---|---|
| 用两个栈实现队列 | ⭐⭐ | 一个入栈,一个出栈 |
| 括号匹配 | ⭐⭐ | 栈 + 哈希映射 |
| 最小栈(O(1)取最小值) | ⭐⭐⭐ | 辅助栈存最小值 |
2.3 二叉树
| 题目 | 难度 | 核心技巧 |
|---|---|---|
| 二叉树的前/中/后序遍历 | ⭐⭐ | 递归 / 迭代(栈) |
| 层序遍历 | ⭐⭐ | 队列 |
| 二叉树的最大深度 | ⭐⭐ | DFS / BFS |
| 由前序+中序重构二叉树 | ⭐⭐⭐ | 递归分治 |
| 二叉搜索树的第K大节点 | ⭐⭐⭐ | 中序遍历 |
| 二叉树的最近公共祖先 | ⭐⭐⭐ | 后序遍历 |
2.4 排序与查找
| 题目 | 难度 | 核心技巧 |
|---|---|---|
| 快速排序 | ⭐⭐⭐ | 分区(挖坑法/前后指针) |
| 归并排序 | ⭐⭐⭐ | 分治 + 合并 |
| 二分查找(变体) | ⭐⭐ | 找左边界/右边界 |
| 数组中的第K大元素 | ⭐⭐⭐ | 快排分区 / 堆 |
| 排序数组查找首尾位置 | ⭐⭐⭐ | 两次二分查找 |
2.5 动态规划
| 题目 | 难度 | 核心技巧 |
|---|---|---|
| 爬楼梯 | ⭐⭐ | dp[i] = dp[i-1] + dp[i-2] |
| 最大子数组和 | ⭐⭐⭐ | Kadane算法 |
| 0-1背包 | ⭐⭐⭐ | 一维dp,内层倒序 |
| 最长公共子序列(LCS) | ⭐⭐⭐ | 二维dp |
| 最长上升子序列(LIS) | ⭐⭐⭐ | O(n log n) 贪心+二分 |
2.6 图论
| 题目 | 难度 | 核心技巧 |
|---|---|---|
| 岛屿数量(DFS/BFS) | ⭐⭐ | 遍历标记 |
| 课程表(拓扑排序) | ⭐⭐⭐ | Kahn算法 / DFS判环 |
| 最短路径(Dijkstra) | ⭐⭐⭐ | 优先队列优化 |
2.7 其他高频题
| 题目 | 难度 | 核心技巧 |
|---|---|---|
| 实现LRU缓存 | ⭐⭐⭐⭐ | 哈希表 + 双向链表 |
| 手写Trie树 | ⭐⭐⭐ | 26叉树 |
| 并查集 | ⭐⭐ | 路径压缩 + 按秩合并 |
| 手写堆(优先队列) | ⭐⭐⭐ | 上浮 + 下沉 |
三、大厂面试常考知识点
3.1 必须掌握
| 类别 | 知识点 |
|---|---|
| 复杂度分析 | 大O表示法、递归复杂度 |
| 线性表 | 数组 vs 链表 |
| 树 | 二叉树遍历、BST、AVL原理 |
| 排序 | 快排、归并、堆排原理与复杂度 |
| 查找 | 二分查找、哈希表 |
| 动态规划 | 背包、LCS |
| 图 | DFS/BFS、最短路径 |
3.2 加分项
| 类别 | 知识点 |
|---|---|
| 高级数据结构 | 红黑树原理、跳跃表、Trie树 |
| 字符串 | KMP算法 |
| 图论 | 最小生成树、拓扑排序 |
| 系统设计 | LRU缓存、一致性哈希 |
四、学习进阶建议
4.1 下一步学什么
| 方向 | 内容 | 推荐资源 |
|---|---|---|
| C++ STL源码 | vector、list、map、set底层实现 | 《STL源码剖析》 |
| Linux内核 | 内核链表、红黑树、调度算法 | 《Linux内核设计与实现》 |
| 数据库 | B+树、哈希索引 | 《数据库系统概念》 |
| 算法竞赛 | 高级DP、图论进阶 | LeetCode、Codeforces |
| 面试刷题 | 高频题专项训练 | LeetCode Hot 100、剑指Offer |
4.2 推荐书籍
| 书名 | 适合阶段 | 说明 |
|---|---|---|
| 《大话数据结构》 | 入门 | 生动形象 |
| 《数据结构与算法分析(C语言描述)》 | 进阶 | 经典教材 |
| 《算法(第4版)》 | 进阶 | 代码清晰 |
| 《剑指Offer》 | 面试 | 高频题集 |
| 《编程珠玑》 | 进阶 | 算法思想 |
4.3 刷题建议
按标签刷:数组 → 链表 → 树 → DP → 图
手写代码:脱离IDE,用纸笔或记事本
总结模板:BFS、DFS、二分、并查集等形成固定写法
复盘错题:记录思路卡点,定期回顾
五、专栏寄语
50篇,从C语言基础到图论高级算法,我们从最简单的顺序表写到了跳跃表。这50篇不是终点,而是你数据结构与算法之路的起点。
几个关键的心得:
不要只看不写:每段代码都值得你亲手敲一遍
画图理解:指针指向、树的旋转、栈的变化,画出来比死记硬背管用
调试是进步的阶梯:段错误和内存泄漏不是敌人,是帮你理解底层的好老师
坚持比天赋重要:算法能力是练出来的,不是看出来的
希望这个专栏能帮你在面试中多一份自信,在写代码时多一份从容。
六、附录:常用复杂度速查表
| 数据结构 | 查找 | 插入 | 删除 |
|---|---|---|---|
| 数组 | O(1) | O(n) | O(n) |
| 链表 | O(n) | O(1)(头插) | O(1)(已知前驱) |
| 哈希表 | O(1)平均 | O(1)平均 | O(1)平均 |
| BST | O(log n)平均 | O(log n)平均 | O(log n)平均 |
| AVL/红黑树 | O(log n) | O(log n) | O(log n) |
| 排序算法 | 平均 | 最坏 | 空间 | 稳定 |
|---|---|---|---|---|
| 快排 | O(n log n) | O(n²) | O(log n) | 否 |
| 归并 | O(n log n) | O(n log n) | O(n) | 是 |
| 堆排 | O(n log n) | O(n log n) | O(1) | 否 |
| 冒泡 | O(n²) | O(n²) | O(1) | 是 |
| 计数 | O(n+k) | O(n+k) | O(k) | 是 |
全文完
感谢你读到这里。如果有任何问题或建议,欢迎在评论区留言。
祝你学习顺利,Offer多多!