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 }