这条线把数据结构与算法从语言教材里抽出来:概念本身不绑定语言,但代码必须能跑。所以每个结构都给你两版——先用语言自带的标准库把功能跑通,再手写一遍底层实现。
只学标准库,面试手写题会卡住;只学手写,工程里会重复造轮子。两版并排放在一起,你才知道标准库替你到底做了什么。
🎯 这条线的规矩:
① 每个结构 / 算法都给 C / C++ / Java / Python 四份完整可运行代码,函数名、变量名、打印格式全部对齐,方便横向对照;
② 每份代码都在
③ 每个操作都标注时间 / 空间复杂度;
④ 每章末尾有能直接照抄的运行命令。
① 每个结构 / 算法都给 C / C++ / Java / Python 四份完整可运行代码,函数名、变量名、打印格式全部对齐,方便横向对照;
② 每份代码都在
gcc 16.1 / g++ 16.1 / javac 21 / Python 3.14 下实测编译运行通过,四份输出逐字节一致;③ 每个操作都标注时间 / 空间复杂度;
④ 每章末尾有能直接照抄的运行命令。
🗂️ 章节导航(12 章)
| 章 | 标题 | 状态 |
|---|---|---|
| 第 1 章 | 链表 · 标准库与手写两版、反转、判环、找中点、合并有序链表 | ✅ 已上线 |
| 第 2 章 | 复杂度与算法分析 · 大 O、量级实测、均摊分析、递归栈、主定理、读题反推 | ✅ 已上线 |
| 第 3 章 | 数组、字符串与二分查找 · 数组代价实测、前缀和、差分、二分三写法、二分答案 | ✅ 已上线 |
| 第 4 章 | 双指针与滑动窗口 · 对撞、快慢、变长窗口 | 📅 规划中 |
| 第 5 章 | 哈希表 · 散列、冲突、扩容,与哈希加速套路 | 📅 规划中 |
| 第 6 章 | 栈与队列 · 循环队列、单调栈、单调队列 | 📅 规划中 |
| 第 7 章 | 树、二叉树与堆 · 遍历、BST、堆、Trie | 📅 规划中 |
| 第 8 章 | 排序与查找 · 十种排序、稳定性、快选 | 📅 规划中 |
| 第 9 章 | 递归、分治与回溯 · 回溯模板、剪枝与去重 | 📅 规划中 |
| 第 10 章 | 贪心 · 区间调度、跳跃游戏与反例辨析 | 📅 规划中 |
| 第 11 章 | 动态规划 · 背包、子序列、区间 DP | 📅 规划中 |
| 第 12 章 | 图论与高级结构 · 拓扑排序、最短路、并查集 | 📅 规划中 |
章节顺序按「从具体到抽象」排:先写最基础的链式结构,再回头补复杂度分析这套工具,然后一路走到图论。
📌 已上线章节速览
第 1 章 链表
| 内容 | 说明 |
|---|---|
| 链表 vs 数组 | 内存布局、随机访问、插入删除、缓存友好度,一张表说清取舍 |
| 复杂度速查 | 头插 / 尾插 / 查找 / 删除 / 反转 / 找中点 / 判环 / 合并,逐项标时间与空间 |
| 标准库写法 | C++ std::list、Java LinkedList、Python collections.deque 三段完整代码 |
| 手写底层实现 | C 结构体 + malloc/free、C++ new/delete、Java 类、Python 类 + __slots__,四段完整代码 |
| 面试高频四件套 | 反转(三指针)、判环(Floyd)、找中点(快慢指针)、合并有序链表(哑结点) |
| 易错点清单 | 七条真实会踩的坑:断链、漏删头结点、忘释放、造环没拆、判空顺序反了等 |
| 练习 | 5 题,从「讲清复杂度」到「找入环点」「合并 K 条有序链表」 |
第 2 章 复杂度与算法分析
| 内容 | 说明 |
|---|---|
| 为什么不能只看秒表 | 机器、编译器、输入规模三个变量都不可控,所以改数「操作次数」 |
| 大 O 怎么推导 | 只留最高阶、丢掉常数系数;七个常见量级对照表 |
| n=1000 实测 | 五个量级的真实计数:二分只问 10 次,双重循环要 499500 次 |
| 均摊分析 | 容量翻倍 vs 每次加 1,实测平均拷贝次数随 n 怎么变(0.94→1.00 对 7.50→511.50) |
| 空间复杂度与递归栈 | 同样的活,递归写栈深度 100 层、迭代写 1 层 |
| 主定理速查 | 三种情形 + 四个常见递归式套用(归并 / 二分 / 树遍历) |
| 读题反推 | 从 n 的范围反推该用什么算法,六档经验表 |
| 常见误区 | 八条:O(1) 不等于快、循环层数不等于复杂度、均摊 O(1) 不等于每次都 O(1) |
第 3 章 数组、字符串与二分查找
| 内容 | 说明 |
|---|---|
| 数组的代价实测 | 随机访问 1 次取值;头部插入要移动 1000 个元素、删除头部 1001 个,而两端操作都是 0 |
| 字符串四语言差异 | C 的 '\0'、Java / Python 不可变、循环拼接为什么会变成 O(n²) |
| 前缀和 | 预处理 O(n),区间查询降到 1 次减法;二维版本用容斥原理 |
| 差分数组 | 区间批量加从 O(n) 降到 2 次修改,代价挪到最后的 O(n) 还原 |
| 二分查找三写法 | 闭区间 / 左闭右开 / lower_bound,附六个边界用例(空数组、单元素、首尾元素、不存在) |
| 二分答案 | 切木头实例:从枚举 24 次降到判定 4 次;三张题型对照表 |
| 选型速查与误区 | 什么时候用前缀和 / 差分 / 二分 / 滑动窗口;七条常见误区 |
🧭 学这条线之前
这条线不要求你先精通某一门语言,但需要你至少能读懂指针 / 引用和结构体 / 类:
| 前置 | 在哪学 |
|---|---|
| C 的指针与结构体 | C 第 6 章 指针与动态内存 · 第 7 章 结构体与枚举 |
| C++ 的指针与内存模型 | C++ 第 4 章 指针、数组与内存模型 |
| Java 的类与对象 | Java 第 4 章 类与对象 |
| Python 的类 | Python 第 7 章 面向对象 |
⚠️ 代码里的内存安全:C / C++ 手写链表要自己
free / delete,忘记释放就是内存泄漏;Java / Python 交给 GC,但要注意「造了环」会让引用计数型回收器(如 C++ 的 shared_ptr)无法回收。本章代码里演示造环之后都会立刻把环拆掉。