双链表
算法总结常用模板
`/ e[]表示节点的值,l[]表示节点的左指针,r[]表示节点的右指针,idx表示当前用到了哪个节点
int e[N], l[N], r[N], idx;
// 初始化
void init()
{
//0是左端点,1是右端点
r[0] = 1, l[1] = 0;
idx = 2;
}
// 在节点a的右边插入一个数x
void insert(int a, int x)
{
e[idx] = x;
l[idx] = a, r[idx] = r[a];
l[r[a]] = idx, r[a] = idx ++ ;
}
// 删除节点a
void remove(int a)
{
l[r[a]] = l[a];
r[l[a]] = r[a];
}
`
C++ 代码
#include<iostream>
#include<cstdio>
using namespace std;
const int N=100010;
int l[N],r[N],e[N],idx;
void init()
{
l[1]=0;
r[0]=1;
idx=2;
}
void remove(int k)
{
l[r[k]]=l[k];
r[l[k]]=r[k];
}
void insertl(int x)
{
l[idx]=0;
r[idx]=r[0];
r[0]=idx;
l[r[idx]]=idx;
e[idx++]=x;
}
void insertr(int x)
{
r[idx]=1;
l[idx]=l[1];
l[1]=idx;
r[l[idx]]=idx;
e[idx++]=x;
}
void insertkl(int k,int x)
{
r[idx]=k;
l[idx]=l[k];
l[k]=idx;
r[l[idx]]=idx;
e[idx++]=x;
}
void insertkr(int k,int x)
{
l[idx]=k;
r[idx]=r[k];
r[k]=idx;
l[r[idx]]=idx;
e[idx++]=x;
}
int main()
{
init();
int m,k,x;
cin>>m;
while(m--)
{
string c;
cin>>c;
if(c=="L")
{
cin>>x;
insertl(x);
}
else if(c=="R")
{
cin>>x;
insertr(x);
}
else if(c=="D")
{
cin>>k;
remove(k+1); //初始化时多加了两个节点,因此k要加一
}
else if(c=="IL")
{
cin>>k>>x;
insertkl(k+1,x);
}
else
{
cin>>k>>x;
insertkr(k+1,x);
}
}
for(int i=r[0];i!=1;i=r[i]) cout<<e[i]<<" ";
return 0;
}