算法基础05:双向链表

双向链表的应用实例

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
package com.algorithm.linkedlist;

/**
* TODO
*
* @author:XMD
* @date: 13.8.22
*/
public class DoubleLinkedListDemo {
public static void main(String[] args) {
//测试
//先创建节点
HeroNode2 heroNode1 = new HeroNode2(1, "宋江", "及时雨");
HeroNode2 heroNode2 = new HeroNode2(2, "卢俊义", "玉麒麟");
HeroNode2 heroNode3 = new HeroNode2(3, "吴用", "智多星");
HeroNode2 heroNode4 = new HeroNode2(4, "林冲", "豹子头");

DoubleLinkedList doubleLinkedList = new DoubleLinkedList();
doubleLinkedList.add(heroNode1);
doubleLinkedList.add(heroNode2);
doubleLinkedList.add(heroNode3);
doubleLinkedList.add(heroNode4);
doubleLinkedList.list();

System.out.println(">>>>>>>>>>>>");

HeroNode2 newHeroNode4 = new HeroNode2(4, "孙大圣", "悟空");
doubleLinkedList.update(newHeroNode4);
doubleLinkedList.list();

System.out.println(">>>>>>>>>>>>");

doubleLinkedList.delete(3);
doubleLinkedList.list();
}
}


class DoubleLinkedList{
/**
* 先初始化一个头节点,头节点不要动,不存放具体数据
*/
private HeroNode2 head = new HeroNode2(0, "", "");
public HeroNode2 getHead(){
return head;
}


/**
* 显式链表(遍历)
*/
public void list() {
//判断链表是否为空
if (head.next == null) {
System.out.println("链表为空");
return;
}
//因为头节点不能动,因为我们需要一个辅助变量来遍历
HeroNode2 temp = head.next;
while (true) {
//判断是否到链表的最后
if (temp == null) {
break;
}
//输出结点信息
System.out.println(temp);
//将节点后移
temp = temp.next;
}
}


/**
* 添加一个节点到双向链表的最后
* @param heroNode
*/
public void add(HeroNode2 heroNode) {
//因为head节点不能动,因此我们需要一个辅助变量temp
HeroNode2 temp = head;
//遍历链表,找到最后
while (true) {
//找到链表的最后
if (temp.next == null) {
break;
}
//如果没有找到,将temp后移
temp = temp.next;
}
//当退出while循环时,temp就指向了链表的最后
//形成一个双向;链表
temp.next = heroNode;
heroNode.pre = temp;
}


/**
* 修改双向链表的一个节点
* @param newHeroNode
*/
public void update(HeroNode2 newHeroNode) {
//判断是否为空
if (head.next == null) {
System.out.println("链表为空");
return;
}

HeroNode2 temp = head.next;
boolean flag = false;
while (true) {
if (temp == null) {
break;//已经遍历完
}
if (temp.no == newHeroNode.no) {
//找到
flag = true;
break;
}
temp = temp.next;
}
//根据flag判断是否找到
if (flag) {
temp.name = newHeroNode.name;
temp.nickname = newHeroNode.nickname;
} else {
System.out.println("没有找到");
}
}

/**
* 删除双向链表的一个节点
* 1 对于双向链表,我们可以直接找到要删除的节点
* 2 找到后自我删除即可
* @param no
*/
public void delete(int no) {
//判断是否为空
if (head.next == null) {
System.out.println("链表为空");
return;
}
//辅助变量
HeroNode2 temp = head.next;
boolean boo = false;
while (true) {
if (temp.next == null) {
//已经到最后
break;
}

if (temp.no == no) {
//找到需要删除的前一个节点
boo = true;
break;
}
temp = temp.next;
}

if (boo) {
temp.pre.next = temp.next;
//不加判断,如果最后一个会揣想那空指针异常
if (temp.next != null){
temp.next.pre = temp.pre;
}
} else {
System.out.println("没有找到这个节点");
}
}

}

/**
* 定义heroNode,每个heroNode对象就是一个节点
*/
class HeroNode2 {
public int no;
public String name;
public String nickname;
//指向后一个节点,默认null
public HeroNode2 next;
//指向前一个节点,默认null
public HeroNode2 pre;

public HeroNode2(int no, String name, String nickname) {
this.no = no;
this.name = name;
this.nickname = nickname;
}

@Override
public String toString() {
return "no=" + no + ", name=" + name + ", nickname=" + nickname;
}
}

-------------本文结束感谢您的阅读-------------