双链表顾名思义就是一个从左到右的指针和一个从右到左的指针。
这里列一些模板
// e[]表示节点的值,l[]表示节点的左指针,r[]表示节点的右指针,idx表示当前用到了哪个节点
int e[N], l[N], r[N], idx;
//初始化
void intx(){
//0是左端点,1是右端点
l[1] = 0;
r[0] = 1;
idx = 2;
}
//删除
int remove(int k){
r[l[k]] = r[k];
l[r[k]] = l[k];
}
//添加 (左右都可以添加)
int add(int k,int x){
e[idx] = x;
r[idx] = ne[k];
l[idx] = k;
l[r[k]] = idx;
r[k] = idx++;
}
然后来看一个例题套模板;
https://www.acwing.com/problem/content/829/
看似5哥操作很繁琐,其实只有2个,一个是删除,另一个就是添加,不过添加时要注意左右。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+9;
int e[N],r[N],l[N],idx;
void intx(){
l[1] = 0;
r[0] = 1;
idx = 2;
}
int add(int k,int x){
e[idx] = x;
r[idx] = r[k];
l