数组模拟单链表/双链表
调试漫谈:如果用vscode调试一定要保证路径和文件名没有中文
单链表
这个比较简单,注意插入在某个数的右边,应该先将“待改动”的数作为被赋值数。也就是说一定要先ne[idx] = head / ne[k],再考虑ne[k]/head = idx
init: null -> -1
after: x -> x -> x ... x -> -1
1 #include <iostream> 2 using namespace std; 3 4 const int maxn = 1e5 + 10; 5 int M, k, x; 6 char op; 7 8 int val[maxn], ne[maxn], head = -1, idx = 0; 9 10 void ins_h(int x) { 11 idx++; 12 val[idx] = x; 13 ne[idx] = head; 14 head = idx; 15 } 16 17 void ins(int k, int x) { 18 idx++; 19 val[idx] = x; 20 ne[idx] = ne[k]; 21 ne[k] = idx; 22 } 23 24 void del(int k) { ne[k] = ne[ne[k]]; } 25 26 int main() { 27 cin >> M; 28 while (M--) { 29 cin >> op; 30 if (op == 'H') { 31 cin >> x; 32 ins_h(x); 33 } 34 if (op == 'D') { 35 cin >> k; 36 if (k == 0) 37 head = ne[head]; 38 else 39 del(k); 40 } 41 if (op == 'I') { 42 cin >> k >> x; 43 ins(k, x); 44 } 45 } 46 47 for (int i = head; i != -1; i = ne[i]) printf("%d ", val[i]); 48 49 return 0; 50 }
双向链表
采用 1 idx idx idx ... idx 0 的写法,(毕竟不能访问l[-1]这种东西。。。)
从左往右获取即为
for (int i = r[0]; i != 1; i = r[i]) printf("%d ", val[i]);
#include <iostream> using namespace std; const int maxn = 4e5 + 10; int val[maxn], l[maxn], r[maxn], M, x, k, idx; string op; void init() { r[0] = 1; l[1] = 0; idx = 1; // idx0 / idx1 function as endpoint of left / right // 0 idxl x idxlk k idlrk x x idxr 1 //the direction of process depend on you insert in L or R // modify l -> modify r <- } void L(int x) { idx++; l[r[0]] = idx; l[idx] = 0; r[idx] = r[0]; r[0] = idx; val[idx] = x; } void R(int x) { idx++; r[l[1]] = idx; r[idx] = 1; l[idx] = l[1]; l[1] = idx; val[idx] = x; } void D(int k) { l[r[k]] = l[k]; r[l[k]] = r[k]; } void IL(int k, int x) { idx++; l[idx] = l[k]; l[k] = idx; r[idx] = k; r[l[idx]] = idx; val[idx] = x; } void IR(int k, int x) { idx++; r[idx] = r[k]; r[k] = idx; l[idx] = k; l[r[idx]] = idx; val[idx] = x; } int main() { init(); cin >> M; while (M--) { cin >> op; if (op == "L") { cin >> x; L(x); } if (op == "R") { cin >> x; R(x); } if (op == "D") { cin >> k; D(k + 1); } if (op == "IL") { cin >> k >> x; IL(k + 1, x); } if (op == "IR") { cin >> k >> x; IR(k + 1, x); } } for (int i = r[0]; i != 1; i = r[i]) printf("%d ", val[i]); return 0; }

浙公网安备 33010602011771号