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