1
+ # 先实现定义自己的一个一个的节点
2
+ class Node (object ):
3
+ def __init__ (self , data ) -> None :
4
+ # 一个节点的数据域
5
+ self .data = data
6
+ # 一个节点的指针域,其存储的是下一个节点的内存地址
7
+ self .next = None
8
+
9
+
10
+ class SingleLinkedList :
11
+ # 在进行实例化的时候我们该有一个初始节点的,通过这个初始节点来实现寻找我们的链表,这个就是头节点了
12
+ def __init__ (self ) -> None :
13
+ self .__head = None
14
+
15
+
16
+ # 获取链表长度
17
+ def __get_length_link (self ) -> int :
18
+ """
19
+ 获取链表长度
20
+ :return:
21
+ """
22
+ p = self .__head
23
+ count = 1
24
+ while p .next is not None :
25
+ p = p .next # 更新指向
26
+ count += 1
27
+ return count
28
+
29
+
30
+ # 实现一个函数来保存数据
31
+ def __save_data_in_list (self ) -> list :
32
+ """
33
+ 将链表元素组成一个列表返回
34
+ :return:
35
+ """
36
+ data_list = []
37
+ current = self .__head
38
+ while current is not None :
39
+ data_list .append (current .data )
40
+ current = current .next
41
+ return data_list
42
+
43
+
44
+ # 添加单个节点操作
45
+ def append_one_node (self , data ) -> None :
46
+ """
47
+ 一次性添加一个元素
48
+ :param data: append element`s value
49
+ :return: None
50
+ """
51
+ # 将元素转化为节点
52
+ node = Node (data )
53
+ # 判断头节点是否为空
54
+ if self .__head is None :
55
+ self .__head = node
56
+
57
+ # 如果不为空,那就将节点挂载在有值的节点上面
58
+ else :
59
+ current = self .__head
60
+ # 如果节点为空,那就直接实现节点的偏移
61
+ while current .next :
62
+ current = current .next
63
+ current .next = node
64
+
65
+
66
+ # 添加多个节点
67
+ def append_many_node (self , list_data : list ) -> None :
68
+ """
69
+ 一次性插入多个元素
70
+ :param list_data:
71
+ :return:
72
+ """
73
+ # 直接遍历列表,实现循环添加单个节点
74
+ for data in list_data :
75
+ self .append_one_node (data )
76
+
77
+
78
+ # 通过下标添加节点
79
+ def append_node_by_index (self , index : int , data ) -> None :
80
+ """
81
+ 通过下标插入元素
82
+ :param index:
83
+ :param data:
84
+ :return:
85
+ """
86
+ if index < 1 :
87
+ raise IndexError ("Index must be greater than 0 \n " )
88
+ if index > self .__get_length_link ():
89
+ raise IndexError ("index out of range!!!\n " )
90
+
91
+ current_node = self .__head
92
+ node = Node (data )
93
+
94
+ if index == 1 :
95
+ node .next = self .__head
96
+ self .__head = node
97
+ else :
98
+ # 中间节点的插入
99
+ current_index = 1 # 记录节点的下标
100
+ # 实现偏移
101
+ while current_node and current_index < index - 1 :
102
+ current_node = current_node .next
103
+ current_index += 1
104
+ # 插入新节点
105
+ node .next = current_node .next
106
+ current_node .next = node
107
+
108
+
109
+ # 遍历显示所有的元素
110
+ def show_link_data (self ) -> None :
111
+ """
112
+ 显示链表啊所有的元素
113
+ :return:
114
+ """
115
+ if self .__head is None :
116
+ print ("链表为空" )
117
+ else :
118
+ # 从头结点依次遍历整个链表元素
119
+ current = self .__head
120
+ while current is not None :
121
+ print (current .data , end = " " )
122
+ current = current .next
123
+ print ("\n " )
124
+
125
+
126
+ # 通过下标实现查找元素: 这里的使用列表实现的话,时间复杂度有是常数级别的查找元素
127
+ def show_data_by_index (self , index : int ) -> None :
128
+ """
129
+ 通过下标显示元素
130
+ :param index:
131
+ :return:
132
+ """
133
+ # 或者说和随机插入元素的思路实现一样的,但是这里的话我是前面提前将数据添加入了一个列表中的
134
+ if index > self .__get_length_link ():
135
+ raise IndexError ("index out of range!!!" )
136
+ data_link_list = self .__save_data_in_list ()
137
+ print (f"第{ index } 个元素为: { data_link_list [index - 1 ]} \n " )
138
+
139
+
140
+ # 删除整个链表
141
+ def clear_link (self ) -> None :
142
+ """
143
+ 清空链表
144
+ :return:
145
+ """
146
+ self .__head = None
147
+
148
+
149
+ # 根据下标删除元素
150
+ def delete_link_by_index (self , index : int ) -> None :
151
+ """
152
+ 根据下标删除元素
153
+ :param index:
154
+ :return:
155
+ """
156
+ if index < 1 :
157
+ raise IndexError ("Index must be greater than 0 \n " )
158
+ if index > self .__get_length_link ():
159
+ raise IndexError ("index out of range!!!\n " )
160
+
161
+ if index == 1 :
162
+ self .__head = self .__head .next
163
+ return
164
+
165
+ current = self .__head
166
+ current_index = 1
167
+ while current and current_index < index - 1 :
168
+ current = current .next
169
+ current_index += 1
170
+ new_current = current .next
171
+ current .next = current .next .next
172
+ new_current .next = None
173
+
174
+
175
+ # 根据值来进行删除元素
176
+ def delete_link_by_value (self , value ) -> None :
177
+ """
178
+ 根据值来删除元素
179
+ :param value:
180
+ :return:
181
+ """
182
+ # 头节点直接改变头节点指向即可
183
+ if self .__head .data == value :
184
+ self .__head = self .__head .next
185
+ return
186
+
187
+ current = self .__head
188
+ while current .next :
189
+ if current .next .data == value :
190
+ current .next = current .next .next
191
+ return
192
+ current = current .next
193
+ if current .next is None :
194
+ raise ValueError ("value is not find" )
195
+
196
+
197
+ # 根据下标修改元素
198
+ def set_link_by_index (self , index : int , data ) -> None :
199
+ """
200
+ 根据下标修改元素
201
+ :param index:
202
+ :param data:
203
+ :return:
204
+ """
205
+ if index < 1 :
206
+ raise IndexError ("Index must be greater than 0 \n " )
207
+ if index > self .__get_length_link ():
208
+ raise IndexError ("index out of range!!!\n " )
209
+
210
+ if index == 1 :
211
+ self .__head .data = data
212
+ return
213
+
214
+ current = self .__head
215
+ current_index = 1
216
+ # 偏移指针
217
+ while current and current_index < index :
218
+ current_index += 1
219
+ current = current .next
220
+ current .data = data
221
+
222
+
223
+ # 根据值来进行修改链表的值
224
+ def set_link_by_value (self , value , data ) -> None :
225
+ """
226
+ 根据值来进行修改元素
227
+ :param value: 指定需要用来查找的指标
228
+ :param data: 需要进行替换的元素
229
+ :return:
230
+ """
231
+ current = self .__head
232
+ if current .data == value :
233
+ current .data = data
234
+ return
235
+
236
+ while current .next :
237
+ if current .next .data == value :
238
+ current .next .data = data
239
+ return
240
+ current = current .next
241
+
242
+ if current .next is None :
243
+ raise ValueError ("value is not find!!!" )
0 commit comments