数组(Arrays)
数组把元素放在连续内存里,用下标可在 时间内随机访问任意位置;在末尾增删通常也很快,但在中间插入或删除需要挪动后面的元素,一般是 。固定长度的数组容量写死;动态数组在元素变多时自动扩容(常见做法是容量翻倍),是多数语言里 vector、列表等容器的底层思路。
- Harvard CS50 - 数组(视频) (2026-01-29)
- UC San Diego - 数组(视频)
- UC San Diego - 动态数组(视频)
- UC Berkeley CS61B - 线性和多维数组(视频)(从 15 分 32 秒开始)
- Python - 嵌套列表(视频)
- 实现动态数组 (2026-02-01)
链表(Linked Lists)
链表由一个个节点串成,每个节点存数据和指向下一个节点的指针;元素在内存里不必连续。已知位置时,在头尾或中间插入、删除往往只需改指针,是 ;但按序号访问要从头往后走,是 。单向链表只指向前驱;双向链表多一个指向前节点的指针,便于从尾部往前删改,代价是每个节点多占一点空间。
- Harvard CS50 - 链表(视频) (2026-02-07)
- Michael Sambol - 4 分钟了解链表(视频) (2026-02-28)
- MyCodeSchool - 链表 C 语言实现(视频) 不是整个视频,只是关于 Node 结构和内存分配的部分。(2026-02-28)
- Steve Summit - 指向指针的指针(文章) 的确:你需要关于”指向指针的指针”的相关知识:(因为当你传递一个指针到一个函数时,该函数可能会改变指针所指向的地址)该页只是为了让你了解”指向指针的指针”这一概念。但我并不推荐这种链式遍历的风格。因为,这种风格的代码,其可读性和可维护性太低。(2026-02-28)
- UC Berkeley CS61B - 链表 1(视频)
- UC Berkeley CS61B - 链表 2(视频)
- UC San Diego - 单链表(视频)
- UC San Diego - 链表 vs 数组:核心差异(视频)
- UC San Diego - 链表 vs 数组:现实世界应用(视频)
- UC San Diego - 双向链表介绍(视频) 并不需要实现。
- 实现单向链表 (2026-02-28)
堆栈(Stack)
堆栈是一种 后进先出(LIFO) 的线性结构:只在同一端压入(push)和弹出(pop),查看栈顶也是 。用数组或链表都能实现,数组版更简单。常见于函数调用栈、括号匹配、DFS、撤销操作等「先处理最近压入的」场景。
- Michael Sambol - Stacks in 3 minutes (2026-03-01)
- UC San Diego - 堆栈
可以不实现,因为使用数组来实现是微不足道的事。
队列(Queue)
队列是一种 先进先出(FIFO) 的线性结构:从一端入队(enqueue)、另一端出队(dequeue),两端操作都是 。与堆栈相对,适合 BFS、任务调度、消息缓冲等「先来的先处理」场景。用数组实现时常配合循环队列,避免频繁搬移元素;用链表实现则头尾各维护指针即可。
- Michael Sambol - Queues in 3 minutes (2026-03-01)
- 圆形队列
- UC San Diego - 队列
- 实现队列 (2026-03-04)
哈希表(Hash table)
哈希表用哈希函数把键映射到桶下标,在理想情况下插入、查找、删除的平均时间都是 。不同键可能落到同一位置(冲突),常见处理方式是链式法(每个桶挂链表)或开放寻址(在表里探测下一个空位)。语言里的 dict / map、缓存、计数表等都依赖这一结构;负载因子过高时要扩容并 rehash。
- OI Wiki - 哈希表 (2026-05-29)
- 菜鸟教程 - 哈希表 (2026-05-29)
- 链式哈希表(视频)
- Table Doubling 和 Karp-Rabin(视频)
- Open Addressing 和密码型哈希(Cryptographic Hashing)(视频)
- PyCon 2010:强大的字典(视频)
- PyCon 2017:字典更强大(视频)
- (高级) 随机化:通用和完美哈希(视频)
- (进阶)完美哈希(Perfect hashing)(视频)
- [复习]4 分钟了解哈希表(视频)
- 核心哈希表(视频)
- 数据结构(视频)
- 电话簿问题(视频)
分布式哈希表
- 实现链式哈希表 (2026-06-01)