数据结构笔记
1.单链表 https://www.acwing.com/problem/content/828/

1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int N = 100010; 5 6 7 int head,e[N],ne[N],idx; 8 //head表示头节点的下标 9 //e[i]表示节点i的值 10 //ne[i]表示节点i的next指针的值(指向哪里) 11 //idx存储当前已经用到了哪个点 12 13 void init() //初始化链表 14 { 15 head = -1; 16 idx = 0; 17 } 18 19 //将x插到头节点 20 void add_to_head(int x) 21 { 22 e[idx] = x; //定义x的值; 23 ne[idx] = head; //使idx的next指针 指向 head的next的指针; 24 head = idx; //重新使head的next指针指向 idx; 25 idx ++; //存储的点加一; 26 27 } 28 29 //将x插到下标是k的后面 30 void add(int k,int x) 31 { 32 e[idx] = x; 33 ne[idx] = ne[k]; 34 ne[k] = idx; 35 idx ++ ; 36 } 37 38 //将下标是k的点的后面的点删掉 39 void remove(int k) 40 { 41 ne[k] = ne[ne[k]]; 42 } 43 44 int main() 45 { 46 int m; 47 cin >> m; 48 49 head = -1; 50 51 while (m -- ) 52 { 53 int x,k; 54 char op[2]; 55 56 cin >> op; 57 if(*op == 'H') 58 { 59 cin >> x; 60 add_to_head(x); 61 } 62 else if(*op == 'D') 63 { 64 cin >> k; 65 if(!k) head = ne[head]; 66 remove(k - 1); 67 } 68 else 69 { 70 cin >> k >> x; 71 add(k - 1,x); 72 } 73 } 74 for (int i = head; i != -1; i = ne[i] ) cout << e[i] << ' '; 75 cout << endl; 76 }
2.双链表

1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int m,e[N],l[N],r[N],idx; 5 6 void init() 7 { 8 r[0] = 1,l[1] = 0; 9 idx = 2; 10 } 11 12 //在第k个点的右边插入一个点x; 13 //若要在左边插入,只需add(l[r[k]],x),即在r[k]左边的这个数的右边插入一个数 14 void add(int k,int x) 15 { 16 e[idx] = x; 17 r[idx] = r[k]; 18 l[idx] = k; 19 l[r[k]] = idx; 20 r[k] = idx; 21 } 22 23 //删除第k个点 24 void remove(int k) 25 { 26 r[l[k]] = r[k]; 27 l[r[k]] = l[k]; 28 }