样例
```
include[HTML_REMOVED]
include[HTML_REMOVED]
using namespace std;
const int N = 1e5 + 10;
int m;
int e[N], l[N], r[N], idx; //e[N]存节点的值; l[]存左指针; r[]存右指针, idx表当前位置
// 初始化
void init(){ //设0 为最左端点; 1 为最右端点; l[]指针指向该元素的前一个元素,r[]指向该元素的后一个元素 当插入元素时 是在 r[0] ~ 1 (l[1] ~ 0)之间插入
l[1] = 0;
r[0] = 1;
idx = 2;
}
//在节点a右边插入一个数x
void insert(int a, int x){
e[idx] = x; //先将 x的值存入节点中
r[idx] = r[a]; // {{令当前待插入节点的右指针 指向 插入前a节点的右指针指向的位置 ;
l[idx] = l[r[a]]; // 【【令当前待插入节点的左指针 指向 插入前的a的右指针指向位置节点 该节点左指针指向的位置 即指向a节点本身 等价 l[idx] = a;
l[r[a]] = idx; // 令插入前 指向a节点的 左指针 指向 当前待插入的节点。 】】
r[a] = idx; // 令插入前a节点的右指针的 指向位置 变为 指向 待插入的当前节点 。}}配套
idx++; //令当前指针下移 方便下次操作
}
//删除 节点a
void remove(int a){
l[r[a]] = l[a]; //令a节点 的下一个位置的节点 的 左指针(指向a节点)改为 指向 a 节点的上一个节点的位置
r[l[a]] = r[a]; //同理 , 令a节点 的上一个位置的节点的 右指针(也是指向 a 节点) 改为 指向 a 节点的下一个位置
}
int main(){
cin >> m;
init();
while(m–){
string op;
int k, x;
cin >> op;
//idx 下表 从 2 开始的
if(!op.compare(“L”)){
cin >> x;
insert(0,x);
}else if(!op.compare(“R”)){
cin >> x;
insert(l[1],x);
}else if(!op.compare(“D”)){
cin >> k;
remove(k +1);
}else if(!op.compare(“IL”)){
cin >> k >> x;
insert(l[k + 1],x);
}else {
cin >> k >> x;
insert(k + 1,x);
}
}
for(int i = r[0]; i != 1; i = r[i]) cout << e[i] << " ";
puts("");
return 0;
}
`````