本代码是基于清华出版社《数据结构》链表部分代码进行修改优化,解决课本原先代码存在的问题(查询或删除不在链表内的值时报错问题,以及无法删除首元结点的小bug)。本代码可能存在部分冗余,但可以基本解决以上描述问题。
代码注释与讲解如下:
"""
实现链表的增删改查操作
"""
#创建一个节点类
class Node(object):
def __init__(self, data):
#节点的值
self.data = data
#节点下一个的位置
self.next = None
#创建一个链表类
class LinList(object):
#初始化头结点,传参直接实例化
def __init__(self):
self.head = Node(None)
#链表连接方法
def cre_link(self):
print("请输入数据,确认按回车键,结束按‘#'")
# 创建一个指针,指向头结点
cNode = self.head
# 数据输入接口
Element = input("请输入当前节点要输入的值")
#检验输入的值
while Element != '#':
#构造新节点
nNode = Node(int(Element))
#将节点下一个位置连接到新节点上
cNode.next = nNode
#指针指向新节点
cNode = cNode.next
#再输入值循环
Element = input("请输入当前节点要输入的值")
#链表插入方法
def insert(self):
#输入插入值和位置
element = input("输入待插入的值")
index = input("请输入节点位置")
#结束判断以及链表溢出检验
if element == '#':
return
if i < 1 or i > self.Length():
return
#指针指向头结点
p = self.head
#遍历找到要找位置的节点的前一点
for i in range(1, index):
p = p.next
#构建新节点
nNode = Node(int(element))
#新节点插入
nNode.next = p.next
p.next = nNode
#链表删除方法
def pop(self):
#输入要删除的数值
element=eval(input("请输入要删除的数值"))
#这里设置双指针,一支直线当前节点,一支指向当前节点前一个节点
pre_p = self.head
p = self.head.next
"""因为这里如果删除的数字不存在链表内,会导致最后的指针指向一个空值,
导致p没有data属性而报错,用try...except...可以避免错误影响程序运行"""
try:
#当节点数值不对,以及节点不为空(说明链表还没结束),寻找下一节点
while (p.data!=element and p):
pre_p=p
p=p.next
except AttributeError:
print("删除失败:未能找到该值!")
#这里p不为空执行,说明是找到节点跳出循环,而不是链表结束退出
if p:
pre_p.next=p.next
print("删除成功!")
else:
print("删除失败:未能找到该值!")
#链表展示方法
def show_link(self):
#指针指向首元结点
p = self.head.next
print("当前链表:")
#当p不为空,说明链表没结束,继续循环
while(p):
#打印出节点数据
print(p.data,end='\t')
#指针移动到下一节点
p=p.next
#结束换行
print()
#链表查询方法
def search_element(self):
#初始化一个位置计数变量
index = 1
#输入查询元素值
element=eval(input("请输入要查找的元素"))
#指针指向首元结点
p = self.head.next
#try...except用法同上
try:
#如果没找到且链表还没结束,继续循环
while p.data!= element and p:
p=p.next
#位置计数值+1
index+=1
except AttributeError:
print("没找到!")
return 0
"""找到的话输出位置(这里if p 是确保p非空,与上面同样的道理,
说明是找到元素而跳出循环,不是因为链表结束而跳出循环"""
if p:
print(index)
return index
else:
print("没找到!")
# 链表长度计算方法
def Length(self):
# 头节点不参与计算,从首元结点开始
p = self.head.next
i = 0
# 判断节点是否为空值,空值说明到链表末端,循环结束
while P:
i += 1
p = p.next
return i
#运行函数
if __name__ =='__main__':
#初始化对象
link = LinList()
link.cre_link()
link.search_element()
link.pop()
link.show_link()