Skip to content

Commit f43e3e3

Browse files
committed
feat: 单向链表添加
0 parents  commit f43e3e3

File tree

1 file changed

+243
-0
lines changed

1 file changed

+243
-0
lines changed

Single_linked_list.py

+243
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,243 @@
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

Comments
 (0)