当前位置:   article > 正文

【双向链表】数据结构详解_双向列表结构

双向列表结构

目录

简介:

代码简单模拟双向列表(详细注解)


简介:

双向链表的应用:linkedList

双向链表也叫双链表,是链表的一种,它的每个数据 结点 中都有两个 指针 ,分别指向直接后继和直接前驱。 所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。 一般我们都构造双向 循环链表 。

好处:插入、删除的速度比ArrayList扩容来的快的多。

缺点:对于随机访问,查询速度慢

代码简单模拟双向列表(详细注解)

结果图例:

注意:

        1.遍历是按照指针指向节点的方式遍历的

        2.插入、删除是把指向节点和下节点的指向改变就完成插入和删除了

        3.我自己改写的有参构造器,相当于新增功能

  1. package com.gao.test.collection.linkedList;
  2. /**
  3. * @Author lie
  4. * @Description 简单介绍双向链表结构
  5. */
  6. public class DoubleLinkedList {
  7. public static void main(String[] args) {
  8. //第一节点
  9. Node first = new Node();
  10. //最后节点
  11. Node last = new Node();
  12. /**
  13. * 模拟双向链表
  14. * 创建3个节点数据
  15. */
  16. //这个相当于在链表尾部添加节点,加进来的节点注意头节点和为节点的位置
  17. // (这个应该封装个方法判断是不是第一个加入,因为简单介绍就不封装了,直接指向了)
  18. Node one = new Node("节点数据1",null,null);
  19. first = one;
  20. Node two = new Node("节点数据2",one,null);
  21. last = two;
  22. Node three = new Node("节点数据3",two,null);
  23. //后面新加的都改变最后指针的位置
  24. last = three;
  25. //正序遍历(第一节点的指针,正向遍历所有节点)
  26. System.out.println("====正序遍历====");
  27. forwardIterator(first);
  28. //倒序遍历(最后节点的指针,倒序遍历所有节点)
  29. System.out.println("====倒序遍历====");
  30. reverseIterator(last);
  31. //2、3节点中间插入(我有参构造器已经考虑进去了,直接传入前后节点,就是中间插入)
  32. Node haha = new Node("哈哈,插入节点",two,three);
  33. //遍历一下
  34. System.out.println("====正序遍历插入后的节点====");
  35. forwardIterator(first);
  36. //删除角标置顶位置的节点
  37. deleteNode(two);
  38. //遍历一下
  39. System.out.println("====正序遍历删除后的节点====");
  40. forwardIterator(first);
  41. }
  42. /**
  43. * 删除节点
  44. * @param index 节点位置
  45. */
  46. private static void deleteNode(Node index) {
  47. //存储一下当前节点的值
  48. final Object item = index.item;
  49. final Node prev = index.pre;
  50. final Node next = index.next;
  51. //前一个节点的next连接到下一个节点上(这里不判断pre、next为空的情况,想看可以追原码看)
  52. prev.next = next;
  53. index.pre = null; //指向空
  54. //后一个节点的pre连接到前一个节点上(这里不判断pre、next为空的情况,想看可以追原码看)
  55. next.pre = prev;
  56. index.next = null; //指向空
  57. index.item = null; //把数据置空,gc处理掉垃圾数据
  58. }
  59. /**
  60. * 正向遍历的方法
  61. * @param first 第一节点
  62. */
  63. private static void forwardIterator(Node first) {
  64. while (null != first) {
  65. System.out.println(first);
  66. first = first.next;
  67. }
  68. }
  69. /**
  70. * 反向遍历的方法
  71. * @param last 最后节点
  72. */
  73. private static void reverseIterator(Node last) {
  74. while (null != last) {
  75. System.out.println(last);
  76. last = last.pre;
  77. }
  78. }
  79. }
  80. class Node{
  81. /**
  82. * 存储节点数据
  83. */
  84. public Object item;
  85. /**
  86. * 链表的前一个节点
  87. */
  88. public Node pre;
  89. /**
  90. * 链表的下一个节点
  91. */
  92. public Node next;
  93. public Node() {
  94. }
  95. /**
  96. * 有参构造器(添加节点)
  97. * @param item object
  98. */
  99. public Node(Object item,Node pre,Node next) {
  100. this.item = item;
  101. //链前面节点
  102. this.pre = pre;
  103. //连接后面节点
  104. this.next = next;
  105. //如果不为空,说明有前面的节点(说明是中间或者是尾部插入操作),把前面节点的next连接这个新增的节点
  106. if(null != pre){
  107. pre.next = this;
  108. }
  109. //如果不为空,说明有后面的节点(说明是中间或者头部插入操作),把后面节点的pre连接这个新增的节点
  110. if (null != next) { next.pre = this;
  111. }
  112. }
  113. @Override
  114. public String toString() {
  115. return item.toString();
  116. }
  117. }

说明:

        简单模拟双向列表,健壮性不足,最好可以直接新建linkedList对象,追源码看。

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

闽ICP备14008679号