同时记录左右两边的下标,用 l[N]
和 r[N]
数组。
为了方便,我们不设置头尾节点指针。我们让下标为0的点当作最左边的节点,让下标为1的点当作最右边的节点。
#include <iostream>
using namespace std;
const int N = 100010;
int m;
int e[N], l[N], r[N], idx;
void init() {
r[0] = 1;
l[1] = 0;
idx = 2;
}
// 在下标为k的节点的右边插入一个k
// 如果需要在k的左边,那就调用add(l[k], x)
void add(int k, int x) {
e[idx] = x;
l[idx] = k;
r[idx] = r[k];
// 注意改变指针的顺序,很重要
l[r[k]] = idx;
r[k] = idx;
idx ++;
}
void remove(int k) {
r[l[k]] = r[k];
l[r[k]] = l[k];
}
int main () {
init();
int m;
scanf("%d", &m);
while (m -- ) {
string t;
cin >> t;
int k, x;
if (t == "L") {
scanf("%d", &x);
add(0, x);
} else if (t == "R") {
scanf("%d", &x);
add(l[1], x);
} else if (t == "D") {
scanf("%d", &k);
remove(k + 1);
} else if (t == "IL") {
scanf("%d%d", &k, &x);
add(l[k + 1], x);
} else {
scanf("%d%d", &k, &x);
add(k + 1, x);
}
}
for (int i = r[0]; i != 1; i = r[i]) printf("%d ", e[i]);
printf("\n");
return 0;
}