1 package linkedlist; 2 3 public class DoubleLinkedListDemo { 4 5 public static void main(String[] args) { 6 System.out.println("雙向鏈表的測試"); 7 HeroNode2 hero1 = new HeroNode2(1, "唐僧", "师傅"); 8 HeroNode2 hero2 = new HeroNode2(2, "孙悟空", "大师兄"); 9 HeroNode2 hero3 = new HeroNode2(3, "猪八戒", "二师兄"); 10 HeroNode2 hero4 = new HeroNode2(4, "沙和尚", "三师弟"); 11 12 DoubleLinkedList doubleLinkedList = new DoubleLinkedList(); 13 doubleLinkedList.add(hero1); 14 doubleLinkedList.add(hero2); 15 doubleLinkedList.add(hero3); 16 doubleLinkedList.add(hero4); 17 18 HeroNode2 newHeroNode = new HeroNode2(2, "六耳猕猴", "假悟空"); 19 doubleLinkedList.update(newHeroNode); 20 21 doubleLinkedList.list(); 22 23 } 24 25 } 26 27 class DoubleLinkedList { 28 private HeroNode2 head = new HeroNode2(0, "", ""); 29 30 public HeroNode2 getHead() { 31 return head; 32 } 33 34 // 遍历双向链表 35 public void list() { 36 if (head.next == null) { 37 System.out.println("链表为空"); 38 return; 39 } 40 HeroNode2 temp = head.next; 41 while (true) { 42 if (temp == null) { 43 break; 44 } 45 System.out.println(temp); 46 temp = temp.next; 47 } 48 } 49 50 // 添加一个节点到双向链表的最后 51 public void add(HeroNode2 heronode) { 52 // 因为head节点不能动,因此我们需要一个辅助遍历temp 53 HeroNode2 temp = head; 54 while (true) { 55 if (temp.next == null) { 56 break; 57 } 58 temp = temp.next; 59 } 60 // 形成双向链表 61 temp.next = heronode; 62 heronode.pre = temp; 63 } 64 65 // 修改一个节点的内容,可以看到和单向链表的一样 66 // 只是节点类型改变 67 public void update(HeroNode2 newHeroNode) { 68 69 if (head.next == null) { 70 System.out.println("链表为空~"); 71 return; 72 } 73 HeroNode2 temp = head.next; 74 boolean flag = false; 75 while (true) { 76 if (temp == null) { 77 break;// 已经遍历完列表 78 } 79 if (temp.no == newHeroNode.no) { 80 flag = true; 81 break; 82 } 83 temp = temp.next; 84 } 85 // 根据flag,判断是否找到要修改的节点 86 if (flag) { 87 temp.name = newHeroNode.name; 88 temp.nickname = newHeroNode.nickname; 89 } else { 90 System.out.println("没有找到编号为" + newHeroNode.no + "的节点,不能修改"); 91 } 92 93 } 94 95 // 方向链表的删除 96 // 1.对于双向链表,我们可以直接找到要删除的这个节点 97 // 2.找到以后自我删除 98 public void del(int no) { 99 if (head.next == null) { 100 System.out.println("链表为空,无法删除"); 101 return; 102 } 103 104 HeroNode2 temp = head.next; 105 106 boolean flag = false; 107 while (true) { 108 if (temp == null) {// 链表最后 109 break; 110 } 111 if (temp.no == no) { 112 flag = true; 113 break; 114 } 115 temp = temp.next; 116 } 117 if (flag) { 118 temp.pre.next = temp.next; 119 // 如果是最后一个节点,就不需要执行下面这句话,否则出现空指针 120 if (temp != null) { 121 temp.next.pre = temp.pre; 122 } 123 124 } else { 125 System.out.println("要删除的节点" + no + "不存在"); 126 } 127 } 128 129 } 130 131 class HeroNode2 { 132 public int no; 133 public String name; 134 public String nickname; 135 public HeroNode2 next;// 指向下一个节点 136 public HeroNode2 pre;// 默认为null 137 // 构造器 138 139 public HeroNode2(int no, String name, String nickname) { 140 super(); 141 this.no = no; 142 this.name = name; 143 this.nickname = nickname; 144 } 145 146 // 重写toString 147 @Override 148 public String toString() { 149 return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]"; 150 151 } 152 153 }