零 前言
为什么放着现成的不用,要用数组来模拟链表?
原因是:这样相当于自己做了一个内存池,可以避免内存泄漏而且方便调试。更深一点来说,数组的存储位置集中,有利于提高Cache命中率。
当然,最重要的是效率原因。算法题中的数据大多十万到百万级别,如果用 new
的方法,很容易TL也就是超时。
所以掌握用数组模拟链表的方法很重要,本篇主要讲述单链表和双链表的模拟。
提示:本文为C++实现,但所有语言通用,会省略部分与实现无关的代码。会跳过一些基础概念,不了解百度即可,咱们直接看实现 ❤
一 单链表
实现
我们使用 e
和 ne
数组分别存储数据和指针,同时初始化 head
和 idx
。
const int N = 100010; // 定义常量
// e[i]表示结点i的值
// ne[i]表示结点i的next指针的指向
// head表示头结点的下标,初始为-1
// idx存储当前用到了哪个结点,也可看作指针
int e[N], ne[N],head = -1, idx;
然后就是实现基础操作插入和删除:
// 头插法:将x插到头结点
void insert_head(int x) {
e[idx] = x;
ne[idx] = head; // 1.将x项指向原先的头结点
head = idx; // 2.x项为新的头结点
idx++;
}
// 普通插入(与头插类似):在第k个插入的数后面插入x项,k从0开始(下同)
// 先将x项指向k项的后一项,再让k项指向x项
void insert(int k, int x) {
e[idx] = x, ne[idx] = ne[k], ne[k] = idx++;