当前位置:   article > 正文

【数据结构】链表算法总结_双链表能优化什么问题

双链表能优化什么问题

知识概览

  • 链表包括单链表和双链表,这里讨论算法题中的链表。为了考虑算法题中对于时间效率的要求,链表通常是用数组模拟成静态链表的形式,速度快。
  • 单链表可以用来写邻接表(包括n个链表),邻接表可以存储树和图,最短路问题、最小生成树问题、最大流问题都可以用邻接表来存储。
  • 双链表用来优化某些问题。

单链表

题目链接

https://www.acwing.com/problem/content/828/

代码

  1. #include <iostream>
  2. using namespace std;
  3. const int N = 100010;
  4. // head 表示头结点的下标
  5. // e[i] 表示节点i的值
  6. // ne[i] 表示节点i的next指针是多少
  7. // idx 存储当前已经用到了哪个点
  8. int head, e[N], ne[N], idx;
  9. // 初始化
  10. void init()
  11. {
  12. head = -1;
  13. idx = 0;
  14. }
  15. // 将x插到头结点
  16. void add_to_head(int x)
  17. {
  18. e[idx] = x, ne[idx] = head, head = idx++;
  19. }
  20. // 将x插到下标是k的点后面
  21. void add(int k, int x)
  22. {
  23. e[idx] = x, ne[idx] = ne[k], ne[k] = idx++;
  24. }
  25. // 将下标是k的点后面的点删掉
  26. void remove(int k)
  27. {
  28. ne[k] = ne[ne[k]];
  29. }
  30. int main()
  31. {
  32. int m;
  33. cin >> m;
  34. init();
  35. while (m--)
  36. {
  37. int k, x;
  38. char op;
  39. cin >> op;
  40. if (op == 'H')
  41. {
  42. cin >> x;
  43. add_to_head(x);
  44. }
  45. else if (op == 'D')
  46. {
  47. cin >> k;
  48. if (!k) head = ne[head];
  49. else remove(k - 1);
  50. }
  51. else if (op == 'I')
  52. {
  53. cin >> k >> x;
  54. add(k - 1, x);
  55. }
  56. }
  57. for (int i = head; i != -1; i = ne[i]) cout << e[i] << ' ';
  58. cout << endl;
  59. return 0;
  60. }

双链表

题目链接

https://www.acwing.com/problem/content/829/

代码

  1. #include <iostream>
  2. using namespace std;
  3. const int N = 100010;
  4. int e[N], l[N], r[N], idx;
  5. // 初始化
  6. void init()
  7. {
  8. // 0表示左端点head,1表示右端点tail
  9. r[0] = 1, l[1] = 0;
  10. idx = 2;
  11. }
  12. // 在下标是k的点的右边,插入x
  13. void add(int k, int x)
  14. {
  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. {
  25. r[l[k]] = r[k];
  26. l[r[k]] = l[k];
  27. }
  28. int main()
  29. {
  30. int m;
  31. cin >> m;
  32. init();
  33. while (m--)
  34. {
  35. string op;
  36. int k, x;
  37. cin >> op;
  38. if (op == "L")
  39. {
  40. cin >> x;
  41. add(0, x);
  42. }
  43. else if (op == "R")
  44. {
  45. cin >> x;
  46. add(l[1], x);
  47. }
  48. else if (op == "D")
  49. {
  50. cin >> k;
  51. remove(k + 1);
  52. }
  53. else if (op == "IL")
  54. {
  55. cin >> k >> x;
  56. add(l[k + 1], x);
  57. }
  58. else
  59. {
  60. cin >> k >> x;
  61. add(k + 1, x);
  62. }
  63. }
  64. for (int i = r[0]; i != 1; i = r[i]) cout << e[i] << ' ';
  65. cout << endl;
  66. return 0;
  67. }

参考资料

  1. AcWing算法基础课
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/840871
推荐阅读
相关标签
  

闽ICP备14008679号