数组模拟单链表,图论的基础
单链表用的最多的是邻接表,邻接表是n个单链表,邻接表是树和图的存储方式
单链表 >> 邻接表 >> 存储树和图
单链表开始时是head指向空节点
插入元素后长这样
每个节点存储两个值
值:val
指针:next
然后用数组模拟就需要定义几个数组
e[N]:存储每个节点的val值
ne[N]:存储每个点的next指针是多少
每个节点都有编号,空节点用-1表示
e[i]和ne[i]是用下标关联起来
0号点的值就是e[0],0号点的next指针就是ne[0] = 1
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 100010; 4 //head表示头结点下标 5 //e[i]表示节点i的值 6 //ne[i]表示节点i的next指针是多少,就是说节点i的下一个点的下标是什么 7 //idx存储当前已经用到了哪个点 8 //注意idx是从0开始的,0号点是第一个插入的点,第k个插入点的下标是k - 1 9 //当我们需要分配一个新的点的时候,把当前idx指向的节点分配给它,然后idx++ 10 int head, e[N], ne[N], idx; 11 //初始化 12 void init() { 13 head = -1; 14 idx = 0; //当前可以从0号点开始分配 15 } 16 //将值为x的节点插入到头结点 17 void add_to_head(int x) { 18 e[idx] = x; 19 ne[idx] = head; 20 head = idx; 21 idx++; 22 } 23 //将值为x的节点插入到下标为k的节点后面 24 //在下标是k - 1的点后面插入一个点 25 void add(int k, int x) { 26 e[idx] = x; 27 ne[idx] = ne[k]; 28 ne[k] = idx; 29 idx++; 30 } 31 //将下标为k的节点的后面的一个节点删除 32 //第k个插入点的下标是k - 1 33 void remove(int k) { 34 ne[k] = ne[ne[k]]; 35 } 36 int main() { 37 init(); 38 int m; 39 cin >> m; 40 while (m--) { 41 int k, x; 42 string c; 43 cin >> c; 44 if (c[0] == 'H') { 45 cin >> x; 46 add_to_head(x); 47 } else if (c[0] == 'D') { 48 cin >> k; 49 if (k == 0) { 50 head = ne[head]; 51 } else { 52 remove(k - 1); 53 } 54 } else { 55 cin >> k >> x; 56 add(k - 1, x); 57 } 58 } 59 for (int i = head; i != -1; i = ne[i]) { 60 cout << e[i] << " "; 61 } 62 cout << endl; 63 return 0; 64 }