注 : 下面操作是 k + 1 ,原因是因为 idx == 1的情况初始化的时候已经使用了
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 1e5 + 9;
int list[N], l[N], r[N], idx;
void init(){
r[0] = 1, l[1] = 0, idx = 2; //初始化头结点(右边指向第一个节点)和第一个节点(左边指向头结点)
}
// x 插到 k 后面
void insert(int k, int x){
list[idx] = x; //建立新节点
l[idx] = k; //将新节点连边
r[idx] = r[k]; //右边连接到下一个节点的左边,左边连接到上一个节点的右边
l[r[k]] = idx; //将原来两个相连接打的节点打断,连到新节点上
r[k] = idx; //右边的左指针连接到新节点的右指针上,左边同理
idx++; //位置加一
}
//删除第 x 个节点
void remove(int x){
r[l[x]] = r[x];
l[r[x]] = l[x];
}
int main(){
int m ;
init();
scanf("%d",&m);
while(m--){
string op;
int k,x;
cin>>op;
if(op == "L"){ //在链表的最左端插入 x 也就是在左边界后插入一个节点,就是最左端插入一个节点
scanf("%d",&x);
insert(0, x);
}
else if(op == "R"){ //在链表的最右端插入也,就是右边界的左节点后插入一个新节点
scanf("%d",&x);
insert(l[1], x);
}
else if(op == "IL"){ //第k个插入的数左侧插入一个数 在第k个插入的数的左节点后插入一个数
scanf("%d%d",&k,&x);
insert(l[k+1], x);
}
else if(op == "IR"){ //第k个插入的数右侧插入一个数
scanf("%d%d",&k,&x);
insert(k+1, x);
}
else if(op == "D"){ //把第k个插入的数删除
scanf("%d",&x);
remove(x+1);
}
}
for(int i = r[0]; i != 1; i = r[i]) printf("%d ",list[i]);
return 0;
}