-
Notifications
You must be signed in to change notification settings - Fork 0
/
LinkedListDemo.java
208 lines (205 loc) · 6.28 KB
/
LinkedListDemo.java
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
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
package com.day3;
/**
* @author Jackson
* @date 2019-10-26 20:19
*/
public class LinkedListDemo {
public static void main(String[] args) {
MyLinkedList myLinkedList = new MyLinkedList();
// 增加节点
myLinkedList.add(8);
myLinkedList.add(7);
myLinkedList.add(2);
myLinkedList.add(6);
myLinkedList.add(5);
myLinkedList.print();
System.out.println("-----------------------");
// 删除节点
myLinkedList.delete(6);
myLinkedList.print();
System.out.println("-----------------------");
// 更新节点
myLinkedList.update(7, 9);
myLinkedList.print();
System.out.println("-----------------------");
// 查询节点
System.out.println(myLinkedList.search(80));
System.out.println("-----------------------");
// 前插节点
System.out.println(myLinkedList.insertFront(3, 99));
myLinkedList.print();
}
}
// 定义一个链表类提供给外部使用
class MyLinkedList{
// 定义根节点
private Node root;
// 定义当前节点下表
private int currentIndex = 0;
// 添加节点
public void add(int data){
if (root == null){
root = new Node(data);
}else {
root.addTailNode(data);
}
}
// 删除节点
public void delete(int data){
// 如果头节点为空 则直接结束
if (root == null) return;
// 如果头节点有值 隔空相连
if (root.data == data){
root = root.next;
}else {
// 递归操作
root.deleteNode(data);
}
}
// 更新节点
public boolean update(int oldData, int newData){
if (root != null){
if (root.getData() == oldData){
root.setData(newData);
return true;
}else {
root.updateNode(oldData, newData);
}
}
return false;
}
// 查询节点
public boolean search(int data){
if (root != null){
if (root.getData() == data){
return true;
}else {
root.searchNode(data);
}
}
return false;
}
// 打印全部节点
public void print(){
if (root != null){
// 打印根节点数据
System.out.print(root.getData()+"->");
// 打印根节点下的数据
root.printNode();
// 换行
System.out.println();
}
}
// 前插节点
public boolean insertFront(int index, int data){
if (index < 0)return false;
currentIndex = 0;
// 表示在根节点之前插入
if (currentIndex == index){
// 创建新节点
Node node = new Node(data);
node.next = root.next;
root.next = node;
return true;
}else {
return root.next.insetFrontNode(index, data);
}
}
// 使用内部类来定义链表的节点对象
private class Node{
// 节点存储的数据
private int data;
// 把当前自己的类型当作属性
private Node next, head;
// 有参的构造方法
public Node(int data){
this.data = data;
}
// 设置数据
public void setData(int data){
this.data = data;
}
// 获取数据
public int getData(){
return data;
}
// 添加节点(尾添加)
public void addTailNode(int data){
// 后面为空直接添加
if (this.next == null){
this.next = new Node(data);
}else {
// 递归操作
this.next.addTailNode(data);
}
}
// 删除节点(删除该节点后面的一个节点)
public void deleteNode(int data){
// 如果该节点后面不为空
if (this.next != null){
// 如果数据域相等
if (this.next.data == data){
// 隔空相连
this.next = this.next.next;
}else {
// 递归操作
this.next.deleteNode(data);
}
}
}
// 更新节点(更新该节点后面的一个节点数据)
public boolean updateNode(int oldData, int newData){
if (this.next != null){
if (this.next.data == oldData){
this.next.data = newData;
return true;
}else {
this.next.updateNode(oldData, newData);
}
}
return false;
}
// 查询节点(查询该节点后面的一个节点的数据)
public boolean searchNode(int data){
if (this.next != null){
if (this.next.data == data){
return true;
}else {
this.next.searchNode(data);
}
}
return false;
}
// 输出所有节点
public void printNode(){
if (this.next != null){
// 输出当前节点的下一个节点的数据
System.out.print(this.next.data+"->");
// 递归操作
this.next.printNode();
}
}
// 前插节点
public boolean insetFrontNode(int index, int data){
if (this.next != null){
// 进入下一个节点
currentIndex += 1;
if (currentIndex == index){
// 新建一个节点
Node node = new Node(data);
// 新节点的下一个节点为原来节点的下一个节点
node.next = this.next;
// 原节点的下一个节点为新节点
this.next = node;
return true;
}else {
return this.next.insetFrontNode(index, data);
}
}else {
// 如果为空则到达链表末尾 直接添加元素
this.addTailNode(data);
return true;
}
}
}
}