链表的查询与操作

        本代码是基于清华出版社《数据结构》链表部分代码进行修改优化,解决课本原先代码存在的问题(查询或删除不在链表内的值时报错问题,以及无法删除首元结点的小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()
​

​

​

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值