#2
东海ECS2023-03-11 08:17
|
自己写的链表方法,请大神给指点下哪里需要改
很多地方没写返回值,没抛出异常,只是写的打印提示
程序代码:
class Node:
def __init__(self,value,next = None):
self.value = value
self.next = next
class LinkList:
"""
链表操作:
增,删,改,查,排
"""
def __init__(self): # 链表初始化
self.head = Node(None)
print("链表初始化成功")
def init_list(self,merge): # 给链表装载数据
"""
给链表挂接数据
"""
p = self.head
i = 0
for item in merge:
p.next = Node(item)
p = p.next
i += 1
print("链表成功装载%d个数据"%i)
def get_len(self): # 获取链表的长度
"""
获取链表的长度
return:返回链表节点数
"""
p = self.head.next
index = 1
while p.next:
p = p.next
index += 1
return index
def show_list(self): # 遍历打印链表中所有节点的值
"""
遍历链表,显示每个节点的值
"""
p = self.head.next
while p:
print(p.value,end=" ")
p= p.next
print()
print("-----------------")
def is_empty(self): # 判断链表是否为空
"""
判断链表是否为空
True:有数据
False:无数据
"""
if self.head.next:
return True
else:
return False
def clear(self): # 清空链表
"""
链表清空
"""
self.head.next = None
print("链表已经清空!")
def append(self,val): # 链表尾部增加数据
"""
链表尾部增加节点数据
val:要增加的值
"""
p = self.head
while p.next:
p = p.next
p.next = Node(val)
def apptop(self, val): # 链表头部增加数据
"""
链表头部增加节点数据
val:要增加的值
"""
t = Node(val)
t.next = self.head.next
self.head.next = t
def insert(self, val, index): # 链表中间增加数据
"""
链表中间插入的值,如果节点索引超出范围,将插入到链表末尾
val:要插入的值
index:要插入的节点索引(索引从0开始)
"""
p = self.head
item = 0
if index >= 0:
while item != index and p != None:
item +=1
p = p.next
if p == None:
print("节点'%d'超出了链表的节点范围,所以插入到链表末尾"%index)
self.append(val)
return
t = Node(val)
t.next = p.next
p.next = t
print("节点'%d'为负值,所以插入到链表头部" % index)
self.apptop(val)
# print("节点'%d'成功插入目标值:"%index,val)
def remove(self, val): # 删除链表中的某个值
"""
删除链表中的值
val:要删除的值
return:返回删除值对应的节点索引
"""
p = self.head
while p.next:
if p.next.value == val:
p.next = p.next.next
print("成功删除目标值:",val)
p = p.next
print("你要操作的值并不在链表中")
def delete(self,index): # 删除链表中某个节点
"""
删除链表中某个节点
index:要删除的节点索引
return:返回删除的值
"""
p = self.head
i = 0
while p:
if i == index:
temp_value = p.next.value
# print("成功删除节点'%d'的值:"%index, p.next.value)
p.next = p.next.next
return temp_value
i += 1
p = p.next
print("你要操作的节点并不在链表中")
return None
def get_value(self, index): # 获取某个节点对应的值
"""
获取节点值
index:节点索引,从0开始
return:返回节点对应的值
"""
if index >= 0:
p = self.head.next
i = 0
while p.next:
if i == index:
return p.value
p = p.next
i += 1
return p.value
def get_index(self,val): # 获取某个值对应的节点
"""
查找某个值对应的节点索引,
val:要查找的值
return:返回节点索引index,找到一个就返回
"""
p = self.head.next
index = 0
while p:
if p.value == val:
print(val, "对应的节点索引为:", index)
return index
index += 1
p = p.next
print(val,"并不在链表中")
def update(self,index,val): # 更改某个节点的值
"""
更改某个节点的值
index:节点索引
"""
if index >= 0:
p = self.head.next
i = 0
while p:
if i == index:
p.value = val
print("节点'%d'对应的值更新为:"%index,val)
return
i += 1
p = p.next
print("超出了链表的节点范围,更新失败")
def move(self, index_1, index_2): # 节点1移动到节点2
"""
节点1到移动节点2,如果节点2超出范围,将移动到链表末尾
index_1:待移动的节点索引[目标节点索引]
index_2:欲移动到的节点索引[目的节点索引]
"""
index = self.get_len()
if index > index_1 >= 0:
if index > index_2 >= 0:
temp_value = self.delete(index_1)
self.insert(temp_value, index_2)
else:
print("第2个节点超出了链表的范围,所以移动失败")
return
else:
print("第1个节点超出了链表的范围,所以移动失败")
return
def reversal(self): # 链表反转
"""
链表反转
"""
p = self.head.next # 先把链表头部后面的数据存到p
self.head.next = None # 把链表清空
if p:
while p: # 循环取p里的数据添加到空链表的0位置
self.apptop(p.value)
p = p.next
return
print("空链表,无需反转")
def order_up(self): # 链表升序
"""
链表升序
"""
p = self.head.next
index = self.get_len()
for i in range(index):
for x in range(i+1, index):
if self.get_value(i) >= self.get_value(x):
self.move(x, i)
def order_down(self): # 链表降序
"""
链表降序
"""
self.order_up()
self.reversal()
def to_list(self): # 链表到列表转换
"""
链表到列表转换
return:返回列表
"""
list_my = []
p = self.head.next
while p:
list_my.append(p.value)
p = p.next
return list_my
# 测试代码
if __name__ == "__main__":
list01 = [3,22,8,7,32,14,48,3,1]
link01 = LinkList()
link01.init_list(list01)
link01.show_list()
link01.reversal()
link01.show_list()
link01.get_len()
[此贴子已经被作者于2023-3-10 12:17编辑过]