单链表
#include <bits/stdc++.h>using namespace std;const int N = 1e5+5;//head:头节点下标,idx:存储当前用到了哪个点//e[i]:表示节点i的值//ne[i]:表示节点i的next指针int n, idx;int head, e[N], ne[N];void init() {head = -1;idx = 0;}//将x插到头节点void add_to_head(int x) {e[idx] = x;ne[idx] = head;head = idx++;}//将x插到下标是k的点的后面void add(int k, int x) {e[idx] = x;ne[idx] = ne[k];ne[k] = idx++;}//删掉下标为k的点后面的点void del(int k) {ne[k] = ne[ne[k]];}signed main() {init();scanf("%d", &n);for (int i = 1; i <= n; i++) {char op[2];int x, k;scanf("%s", op);if (*op == 'H') {scanf("%d", &x);add_to_head(x);} else if (*op == 'D') {scanf("%d", &k);if (!k) {head = ne[head];} else {del(k-1);}} else {scanf("%d%d", &k, &x);add(k-1, x);}}for (int i = head; i != -1; i = ne[i])cout << e[i] << ' ';puts("");return 0;}
双链表
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int n, idx;
int e[N], l[N], r[N];
void init() {
r[0] = 1, l[1] = 0;
idx = 2;
}
//在节点k的右边插入一个数x
void insert(int k, int x) {
e[idx] = x;
l[idx] = k, r[idx] = r[k];
l[r[k]] = idx, r[k] = idx++;
}
//删除节点k
void del(int k) {
l[r[k]] = l[k];
r[l[k]] = r[k];
}
signed main() {
init();
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
string op;
cin >> op;
int k, x;
if (op == "L") {
scanf("%d", &x);
insert(0, x);
} else if (op == "R") {
scanf("%d", &x);
insert(l[1], x);
} else if (op == "D") {
scanf("%d", &k);
del(k+1);
} else if (op == "IL") {
scanf("%d%d", &k, &x);
insert(l[k+1], x);
} else {
scanf("%d%d", &k, &x);
insert(k+1, x);
}
}
for (int i = r[0]; i != 1; i = r[i])
cout << e[i] << ' ';
puts("");
return 0;
}
