双链表一个节点里面有两个指针,一个指向左边,一个指向右边
不定义头结点和尾结点了
令下标是0的点表示head
令下标是1的点表示tail
邻接表的知识:把每个点的所有邻边全部存下来
邻接表就是n个单链表
head[i]存储第i个点的邻边
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 100010; 4 int e[N], l[N], r[N], idx; 5 //l[i]存储i这个点左边是谁 6 //r[i]存储i这个点右边是谁 7 //初始化 8 void init() { 9 r[0] = 1; 10 l[1] = 0; 11 idx = 2; //因为0和1已经用过了 12 } 13 //在下标是k的节点右边插入值为x的节点 14 void add(int k, int x) { 15 e[idx] = x; 16 r[idx] = r[k]; 17 l[idx] = k; 18 l[r[k]] = idx; 19 r[k] = idx; 20 idx++; 21 } 22 //删除下标为k的节点 23 void remove(int k) { 24 r[l[k]] = r[k]; 25 l[r[k]] = l[k]; 26 } 27 int main() { 28 init(); 29 int m; 30 cin >> m; 31 while (m--) { 32 string s; 33 int k, x; 34 cin >> s; 35 if (s == "L") { 36 cin >> x; 37 add(0, x); 38 } else if (s == "R") { 39 cin >> x; 40 add(l[1], x); 41 } else if (s == "D") { 42 cin >> k; 43 remove(k + 1); 44 } else if (s == "IL") { 45 cin >> k >> x; 46 add(l[k + 1], x); 47 } else { 48 cin >> k >> x; 49 add(k + 1, x); 50 } 51 } 52 for (int i = r[0]; i != 1; i = r[i]) { 53 cout << e[i] << " "; 54 } 55 cout << endl; 56 return 0; 57 }