用数组替代指针实现单链表即静态链表,核心是以整型下标代替指针进行跳转,节点连续存储于结构体数组中,通过head和free_head管理数据链与空闲链,所有操作为o(1)或o(k)时间复杂度且无内存分配开销。

用数组替代指针实现单链表,核心是把“地址跳转”换成“下标跳转”,去掉动态内存分配和指针解引用开销,让节点连续存储、缓存友好、访问极快。这不是模拟指针,而是用整数索引直接映射逻辑链接关系——本质是「静态链表」(Static Linked List)。
用整型数组存“下一个位置”的下标
每个节点不存指针,只存 next 字段为 int 类型的下标(如 -1 表示空/尾)。整个链表所有节点按顺序存在一个结构体数组里,比如:
struct Node { int data; int next; } pool[MAX_N];- 头节点下标记作
head = 0,pool[0].next指向下个节点下标(如 3),pool[3].next再指向下下个…… - 空闲节点也用一个“空闲链表”管理:用一个整数
free_head记录第一个可用下标,其next指向下一个空闲位置,形成独立的索引链。
预分配 + 下标池管理,彻底避免 new/malloc
初始化时一次性分配固定大小数组(如 4096 项),所有增删都在这个池内周转:
- 插入:从
free_head取一个下标,填数据,更新free_head = pool[free_head].next - 删除:把被删节点下标插回空闲链表头部:
pool[del_idx].next = free_head; free_head = del_idx; - 没有内存分配失败风险,无碎片,无 cache line 跳跃——CPU 预取器能高效跟上连续下标访问。
遍历与操作全部变成纯数组下标访问
传统指针链表遍历:cur = cur->next(间接寻址,可能 miss cache);数组版是:cur = pool[cur].next(直接数组索引,现代 CPU 对 arr[i] 优化极好):
- 循环写法简洁:
for (int i = head; i != -1; i = pool[i].next) { ... } - 插入到第 k 位?只需两步:找到第 k−1 个下标
p,令new_node.next = pool[p].next; pool[p].next = new_idx; - 所有操作时间复杂度不变(O(1) 插删头,O(k) 查找),但常数极小——没有指针解引用、没有 heap 管理、没有虚函数/RTTI 开销。
可选增强:紧凑布局 + 无分支遍历
进一步提速可做两件事:
- 把
data和next放进一个int:若数据范围小(如 ≤ 2²⁰),用低 20 位存 data,高 12 位存 next 下标(支持最多 4096 节点),单次 load 完成读取。 - 批量处理时用 SIMD 隐式跳转:提前展开 4 轮循环,用
mask控制是否继续,减少分支预测失败。 - 头尾双下标缓存(
head,tail),让 append 变 O(1),无需遍历到底。











