原题链接

在算法题目中通常使用数组模拟链表,不使用 new 来初始化 Node 节点,因为数组模拟的速度非常快,new 操作很慢。

  1. 使用 e[i] ne[i] head idx 模拟的链表叫做静态链表。

  2. 使用

1
2
3
4
struct Node {
int val;
Node* next;
};

这样的结构体和 new 关键字创建的链表叫做动态链表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
using namespace std;

const int N = 100010;
// e[i] 表示节点 i 的值
// ne[i] 表示节点 i 的下一个节点标号是多少
// head 表示头结点标号
// idx 用于维护当前用到哪个了节点标号
int e[N], ne[N], head, idx;

void init() {
head = -1;
idx = 0;
}

void add_to_head(int x) {
e[idx] = x;
ne[idx] = head;
head = idx++;
}
void add(int k, int x) {
e[idx] = x;
ne[idx] = ne[k];
ne[k] = idx++;
}
void remove(int k) {
ne[k] = ne[ne[k]];
}

int main() {
int m;
cin >> m;
init();
while(m--) {
char op;
int k, x;
cin >> op;
if(op == 'H') {
cin >> x;
add_to_head(x);
} else if(op == 'D') {
cin >> k;
if(!k) head = ne[head];
else remove(k-1);
} else {
cin >> k >> x;
add(k-1, x);
}
}
for(int i=head;i!=-1;i=ne[i]) {
cout << e[i] << " ";
}
cout << endl;
}