声明
本文资料参考acwing算法基础课
地址:https://www.acwing.com
概述
- 解决问题:用数组实现双链表
- 主要包括:结点内容e[N],结点右指针r[N],结点左指针l[N],下一个可用结点idx
- 双链表一般都要使用头尾结点!
模板记忆
这个模板分为四个部分:
- 初始化:头尾两个指针+idx
- 插入:插入三部曲:内容、指针、被指针++
- 删除:两侧指针互相指
- 遍历:从头到尾遍历整个链表
模板代码
int e[N], l[N], r[N], idx; // 使用头尾结点,不需要head变量
void init()
{
r[0] = 1; // 头指向尾
l[1] = 0; // 尾指向头
idx = 2; // idx跳过头尾
}
void add(int k, int x) // 在k结点后面插入x,一切插入都可以用这句实现
{
e[idx] = x; // 改结点内容
l[idx] = k, r[idx] = r[k]; // 改前后指针
l[r[k]] = idx, r[k] = idx ++ ; // 改两侧结点指针(先改右侧的)
}
void del(int k) // 删除k结点
{
r[l[k]] = r[k]; // 两侧结点互指
l[r[k]] = l[k];
}
for (int i = r[0]; i != 1; i = r[i]) cout << e[i] << ' '; // 遍历整个链表