双链表顾名思义就是一个从左到右的指针和一个从右到左的指针。
这里列一些模板
// 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[idx] = k;
l[r[k]] = idx;
r[k] = idx++;
}
int remove(int k){
r[l[k]] = r[k];
l[r[k]] = l[k];
}
int main(){
int m;
intx();
cin >> m;
while(m--){
int k,x;
string op;
cin >> op;
if(op=="D"){
cin >> k;
remove(k+1);
}
else if(op=="L"){
cin >> x;
add(0,x);
}
else if(op=="R"){
cin >> x;
add(l[1],x);
}
else if(op=="IL"){
cin >> k >> x;
add(l[k+1],x);
}
else{
cin >> k >> x;
add(k+1,x);
}
}
for(int i=r[0];i!=1;i=r[i]) cout << e[i] << " ";
cout << endl;
return 0;
}