双向链表

特点

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

    代码实现

    ```java /**

    • @author laoduan
    • @create 2020-04-09-21:29 */ public class DoubleLinkedListDemo { public static void main(String[] args) {

      1. System.out.println("-------------------双向链表测试-----------------------\n\n");
  1. HeroNode2 hero1 = new HeroNode2(1, "贾克斯", "武器大师");
  2. HeroNode2 hero2 = new HeroNode2(2, "李青", "盲僧");
  3. HeroNode2 hero3 = new HeroNode2(3, "凯瑟琳", "皮城女警");
  4. HeroNode2 hero4 = new HeroNode2(4, "提莫", "迅捷斥候");
  5. DoubleLinkedList doubleLinkedList = new DoubleLinkedList();

// doubleLinkedList.add(hero1); // doubleLinkedList.add(hero2); // doubleLinkedList.add(hero3); // doubleLinkedList.add(hero4); // System.out.println(“—————————-显示双向链表——————————\n”); // doubleLinkedList.list();

  1. System.out.println("--------------------顺序添加-----------------\n\n");
  2. doubleLinkedList.orderadd(hero2);
  3. doubleLinkedList.orderadd(hero1);
  4. doubleLinkedList.orderadd(hero4);
  5. doubleLinkedList.orderadd(hero3);
  6. doubleLinkedList.list();

// //修改 // HeroNode2 newHeroNode = new HeroNode2(2,”豹女”,”狂野女猎手”); // doubleLinkedList.update(newHeroNode); // System.out.println(“——————————-“); // doubleLinkedList.list(); // // //删除 // System.out.println(“————————-删除双向链表\n\n”); // doubleLinkedList.dele(3); // doubleLinkedList.list();

  1. }

}

class DoubleLinkedList{ private HeroNode2 head = new HeroNode2(0,””,””); public HeroNode2 getHead() { return head; } //显示 public void list(){ if(head.next==null){ System.out.println(“链表为空”); return; } //头结点不能动,创建一个temp HeroNode2 temp=head.next; while (true){ if(temp==null){ break; } System.out.println(temp); //将temp后移 temp=temp.next; } }

  1. //添加
  2. public void add(HeroNode2 heroNode){
  3. HeroNode2 temp = head;
  4. //遍历链表,找到最后
  5. while (true){
  6. if(temp.next==null){
  7. break;
  8. }
  9. temp=temp.next;
  10. }
  11. //形成一个双向链表
  12. temp.next=heroNode;
  13. heroNode.pre=temp;
  14. }
  15. //按编号顺序添加
  16. public void orderadd(HeroNode2 heroNode){
  17. HeroNode2 temp = head;
  18. if(temp==null){
  19. return;
  20. }
  21. while (true){
  22. if (temp.next==null){
  23. break;
  24. }
  25. if(temp.next.no>heroNode.no){
  26. break;
  27. }
  28. temp=temp.next;
  29. }
  30. heroNode.next=temp.next;
  31. heroNode.pre=temp;
  32. temp.next=heroNode;
  33. }
  34. //修改一个结点,和单向链表基本一样,只是节点类型是heronode2
  35. public void update(HeroNode2 heroNode){
  36. if (head.next==null){
  37. System.out.println("链表为空");
  38. return;
  39. }
  40. HeroNode2 temp = head;
  41. boolean flag = false;
  42. while (true){
  43. if(temp.next.no==heroNode.no){
  44. flag=true;
  45. break;
  46. }if(temp.next==null){
  47. System.out.println("链表中没有你要找的结点");
  48. break;
  49. }
  50. temp=temp.next;
  51. }
  52. if(flag){
  53. temp.next.nickname=heroNode.nickname;
  54. temp.next.name=heroNode.name;
  55. }
  56. }
  57. //删除
  58. public void dele(int no){
  59. //判断当前链表是否为空
  60. if(head.next==null){
  61. System.out.println("链表为空,无法删除");
  62. return;
  63. }
  64. HeroNode2 temp = head.next;
  65. boolean flag= false;
  66. while (true){
  67. if(temp==null){
  68. System.out.println("链表中没有你要删的结点");
  69. break;
  70. }if(temp.no==no){
  71. flag=true;
  72. break;
  73. }
  74. temp=temp.next;
  75. }
  76. if(flag){
  77. temp.pre.next=temp.next;
  78. //如果是最后一个结点,就不需要执行下面一句话,否则空指针异常
  79. if(temp.next!=null){
  80. temp.next.pre=temp.pre;
  81. }
  82. }
  83. else {
  84. System.out.printf("要删除的%d结点不在",no);
  85. }
  86. }

}

class HeroNode2{ public int no; public String name; public String nickname; public HeroNode2 next;//默认为null public HeroNode2 pre;

  1. //构造器
  2. public HeroNode2(int hNo,String hName,String hNickname){
  3. this.no=hNo;
  4. this.name=hName;
  5. this.nickname=hNickname;
  6. }
  7. //重写toString
  8. @Override
  9. public String toString() {
  10. return "HeroNode{" +
  11. "no=" + no +
  12. ", name='" + name + '\'' +
  13. ", nickname='" + nickname + '\'' +
  14. '}';
  15. }

} ```