链表与邻接表:树与图的存储(用数组模拟)
单链表
算法思想(静态链表)
- 用数组模拟效率高,以为如果用结构体的话,每次要new一个节点,这样会很慢
- 单链表–>邻接表–>存储树和图
- 双链表–>用来优化某些题目
- 刚开始设置头结点head为空
- 数组表示链表,e[N]为节点存储的值,ne[N]节点指向的下一个节点,空节点的下标用-1表示

完整代码
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
| #include<iostream>
using namespace std;
const int N = 1e5 + 10;
int head,e[N],ne[N],idx;
void init(){ head = -1; idx = 0; }
void add_to_head(int x){ e[idx] = x; ne[idx] = head; head = idx; idx++; }
void add(int k,int x){ e[idx] = x; ne[idx] = ne[k]; ne[k] = idx; idx ++; }
void remove(int k){ ne[k] = ne[ne[k]]; }
int main(){ int m; cin >> m; init(); while(m--){ 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]; 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; }
|
双链表
算法思想
与单链表类似,只是多了一个指向左边的数组,初始化不一样而已。
模板代码
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
| #include<iostream> using namespace std; const int N = 1e5 + 10; int m; int e[N],l[N],r[N],idx;
void init(){ r[0] = 1,l[1] = 0; idx = 2; }
void add(int k,int x){ e[idx] = x; r[idx] = r[k]; l[idx] = k; l[r[k]] = idx; r[k] = idx; }
void remove(int k){ r[l[k]] = r[k]; l[r[k]] = l[k]; }
int main(){ return 0; }
|