题目

代码
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 100010;
int head, idx, e[N], ne[N];
// 两个值,两个数组// head:第一个节点的下标(表示头结点的下标)
// idx:已经存储了几个数(到了第几个数了)
// e[i]:存储数的值(表示节点i的值)
// ne[i]:下一个节点的下标(表示节点i)void init()
{head = -1;idx = 0;
}void insert_head(int x)
{e[idx] = x;ne[idx] = head;head = idx;idx++;
}void insert_value(int k, int x)
{e[idx] = x;ne[idx] = ne[k];ne[k] = idx;idx++;
}void erase_k(int k)
{ne[k] = ne[ne[k]];
}void output()
{for (int i = head; i != -1; i = ne[i]){cout << e[i] << " ";}
}
int main()
{int m;cin >> m;init();while (m--){char c;cin >> c;if (c == 'H'){int x;cin >> x;insert_head(x);}else if (c == 'I'){int k, x;cin >> k >> x;insert_value(k - 1, x); // 因为下标从0开始,所以k-1。(0表示第一个数)}else{int k;cin >> k;if (k == 0) // 这里要有一个特判。(删除头结点时要重新创建头结点,头结点也就是第一个数){head = ne[head];}else{erase_k(k - 1); // 因为下标从0开始,所以k-1。(0表示第一个数)}}}output();return 0;
}