单链表、双链表

单链表

题目

AcWing 826

代码

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include<bits/stdc++.h>
using namespace std;

const int N = 100010;

/*单链表(静态单向)*/
//e[i]: val
//ne[i]: next (-1: NULL)
//head : 头节点下标
//idx: 当前用的点下标
int head, e[N], ne[N], idx;

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

//将x拆入头节点
void add_to_head(int x){
//让idx点连接head,head连接idx,更新idx
e[idx] = x, ne[idx] = head, head = idx ++;
}

//将x插入k后
void add(int x, int k){
//让idx点连接k的next,k连接idx,更新idx
e[idx] = x;
ne[idx] = ne[k];
ne[k] = idx;
idx ++;
}

//删除k的后节点
void remove(int k){
//k节点next指向后节点的next
ne[k] = ne[ne[k]];
}

int main(int argc, char const *argv[])
{
init();
int n;
cin >> n;
while (n--){
int k, x;
char op;

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;

return 0;
}

//Debug:
//1.检查读入
//2.检查各个状态处理情况

双链表

代码

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
/*双链表(静态双向)*/
//e[i]: val
//r[i]: right_next
//l[i]: left_next
//head : 头节点下标
//idx: 当前用的点下标
int head, e[N], l[N], r[N], idx;

void init(){
// 0 表示头端点
// 1 表示右端点
r[0] = 1;
l[1] = 0;
idx = 2;
}

//将x插入k右边
//在k的左边插入x = 在l[k]的右边插入x
void add(int k, int x){
//让idx点连接左右点,左右点连接k,更新idx
e[idx] = x;
r[idx] = k;
l[idx] = r[k];
l[r[k]] = idx;
r[k] = idx;

idx ++;
}

//删除k点
void remove(int k){
//跳过k点
r[l[k]] = r[k];
l[r[k]] = l[k];
}