思路: 只需要定义两个数组分别作为指向前驱结点和后继结点的指针即可。具体见代码部分
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 100010;
int l[N],r[N],e[N],idx = 2;
void insert(int k,int x)//在第k个插入的结点的右边插入一个结点。注意是右边
{
e[idx] = x;
r[idx] = r[k];
l[idx] = k;
l[r[k]] = idx;
r[k] = idx++;//先让新插入的结点的两个指针分别指向k与k的后继,然后再先让k的后继指向新的结点,最后k的前驱指向新的结点。
}
void del(int k)
{
l[r[k]] = l[k];
r[l[k]] = r[k];//直接跳过k结点
}
int main()
{
l[1] = 0,r[0] = 1;//初始化0为头结点,1为尾结点
int m,k,x;
scanf("%d",&m);
while(m--)
{
string op;
cin>>op;
if(op == "IL")
{
scanf("%d%d",&k,&x);
insert(l[k+1],x);//因为idx从下标2开始
}
else if(op == "IR")
{
scanf("%d%d",&k,&x);
insert(k+1,x);
}
else if(op == "L")
{
scanf("%d",&x);
insert(0,x);
}
else if(op == "R")
{
scanf("%d",&x);
insert(l[1],x);
}
else
{
scanf("%d",&k);
del(k+1);
}
}
for(int i = r[0];i != 1;i = r[i])
printf("%d ",e[i]);
return 0;
}