同时记录左右两边的下标,用 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;
}
最后修改:2025 年 03 月 31 日
如果觉得我的文章对你有用,请随意赞赏