当前位置:   article > 正文

Java数据结构与算法——双向链表_java双向链表数据结构

java双向链表数据结构

1.简介

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


2.代码案例

首先,我们需要有一个实体类,它对应了双向链表中的每个节点的数据信息。

  1. package com.szh.bidirectional;
  2. /**
  3. *
  4. */
  5. public class BookNode {
  6. public int id;
  7. public String name;
  8. public double price;
  9. public BookNode prev; //当前节点的前驱节点
  10. public BookNode next; //当前节点的后继节点
  11. public BookNode(int id, String name, double price) {
  12. this.id = id;
  13. this.name = name;
  14. this.price = price;
  15. }
  16. @Override
  17. public String toString() {
  18. return "BookNode{" +
  19. "id=" + id +
  20. ", name='" + name + '\'' +
  21. ", price=" + price +
  22. '}';
  23. }
  24. }

接下来,我们写一个具体对双向链表进行CRUD的操作类。

  1. package com.szh.bidirectional;
  2. import com.szh.unidirectional.GoodsNode;
  3. /**
  4. *
  5. */
  6. public class DualLinkedList {
  7. private BookNode head = new BookNode(0, "", 0.0);
  8. //在双向链表末尾插入节点
  9. public void addLast(BookNode bookNode) {
  10. BookNode temp = head; //辅助变量
  11. while (true) {
  12. if (temp.next == null) { //此双向链表为空
  13. break;
  14. }
  15. temp = temp.next;
  16. }
  17. //末尾节点的后继指针指向要插入的新节点
  18. temp.next = bookNode;
  19. //新节点的前驱指针指向原来的末尾节点
  20. bookNode.prev = temp;
  21. }
  22. //在双向链表的中间某个位置插入节点
  23. public void addOrder(BookNode bookNode) {
  24. BookNode temp = head; //辅助变量
  25. boolean flag = false; //标记变量
  26. while (true) {
  27. if (temp == null) {
  28. break;
  29. }
  30. if (temp.next.id > bookNode.id) {
  31. break;
  32. } else if (temp.next.id == bookNode.id) {
  33. flag = true;
  34. break;
  35. }
  36. temp = temp.next;
  37. }
  38. if (flag) {
  39. System.out.println("已经存在了该商品,不能添加重复元素");
  40. } else {
  41. bookNode.next = temp.next;
  42. temp.next.prev = bookNode;
  43. temp.next = bookNode;
  44. bookNode.prev = temp;
  45. }
  46. }
  47. //修改双向链表的某个节点
  48. public void updateNode(BookNode bookNode) {
  49. //是否是空链表
  50. if (head.next == null) {
  51. System.out.println("空链表....");
  52. return;
  53. }
  54. BookNode temp = head.next;
  55. boolean flag = false;
  56. while (true) {
  57. if (temp == null) {
  58. break;
  59. }
  60. if (temp.id == bookNode.id) {
  61. flag = true;
  62. break;
  63. }
  64. temp = temp.next;
  65. }
  66. if (flag) {
  67. temp.name = bookNode.name;
  68. temp.price = bookNode.price;
  69. } else {
  70. System.out.println("未找到要修改的节点....");
  71. }
  72. }
  73. //删除双向链表的某个节点
  74. public void deleteNode(int id) {
  75. //是否是空链表
  76. if (head.next == null) {
  77. System.out.println("空链表....");
  78. return;
  79. }
  80. BookNode temp = head.next;
  81. boolean flag = false;
  82. while (true) {
  83. if (temp == null) {
  84. break;
  85. }
  86. if (temp.id == id) {
  87. flag = true;
  88. break;
  89. }
  90. temp = temp.next;
  91. }
  92. if (flag) {
  93. temp.prev.next = temp.next;
  94. if (temp.next != null) {
  95. temp.next.prev = temp.prev;
  96. }
  97. } else {
  98. System.out.println("未找到要删除的节点....");
  99. }
  100. }
  101. //遍历单向链表,查看每个节点元素
  102. public void list() {
  103. //如果链表为空
  104. if (head.next == null) {
  105. System.out.println("链表为空....");
  106. return;
  107. }
  108. BookNode temp = head.next; //辅助变量
  109. int index = 0;
  110. while (true) {
  111. if (temp == null) {
  112. break;
  113. }
  114. System.out.println("第 " + (++index) + " 个节点元素为:" + temp);
  115. temp = temp.next;
  116. }
  117. }
  118. //统计单向链表中节点的个数
  119. public int getNodeNum() {
  120. //如果链表为空
  121. if (head.next == null) {
  122. System.out.println("链表为空....");
  123. return 0;
  124. }
  125. BookNode temp = head.next;
  126. int num = 0;
  127. while (temp != null) {
  128. num++;
  129. temp = temp.next;
  130. }
  131. return num;
  132. }
  133. }

最后是我们的主方法类,我们需要对上面写好的代码功能进行测试。

  1. package com.szh.bidirectional;
  2. import com.szh.unidirectional.GoodsNode;
  3. /**
  4. * 双向链表相关操作
  5. */
  6. public class LinkedTest2 {
  7. public static void main(String[] args) {
  8. DualLinkedList dualLinkedList = new DualLinkedList();
  9. BookNode bookNode1 = new BookNode(1, "斗罗大陆", 111.111);
  10. BookNode bookNode2 = new BookNode(2, "斗破苍穹", 666.666);
  11. BookNode bookNode3 = new BookNode(3, "盗墓笔记", 999.999);
  12. BookNode bookNode4 = new BookNode(4, "鬼吹灯", 888.888);
  13. System.out.println("双向链表的插入操作:");
  14. dualLinkedList.addLast(bookNode1);
  15. dualLinkedList.addLast(bookNode4);
  16. dualLinkedList.addOrder(bookNode3);
  17. dualLinkedList.addOrder(bookNode2);
  18. dualLinkedList.list();
  19. System.out.println("此双向链表中共有 " + dualLinkedList.getNodeNum() + " 个节点元素。");
  20. System.out.println();
  21. System.out.println("双向链表的修改操作:");
  22. dualLinkedList.updateNode(new BookNode(2, "Java编程思想", 555.555));
  23. dualLinkedList.list();
  24. System.out.println("此双向链表中共有 " + dualLinkedList.getNodeNum() + " 个节点元素。");
  25. System.out.println();
  26. System.out.println("双向链表的删除操作:");
  27. dualLinkedList.deleteNode(2);
  28. dualLinkedList.list();
  29. System.out.println("此双向链表中共有 " + dualLinkedList.getNodeNum() + " 个节点元素。");
  30. }
  31. }

代码运行结果如下:

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