Python中如何实现双向链表并进行常见操作
Admin 2022-08-19 群英技术资讯 840 次浏览
这篇文章主要讲解了“Python中如何实现双向链表并进行常见操作”,文中的讲解内容简单、清晰、详细,对大家学习或是工作可能会有一定的帮助,希望大家阅读完这篇文章能有所收获。下面就请大家跟着小编的思路一起来学习一下吧。使用python实现双向循环链表,供大家参考,具体内容如下
双向循环链表: 将所有的数据存放到节点中,每一个节点相连接,首尾链接,
每一个节点中有一个数据存储区,和两个链接区,一个链接前一个节点,一个链接下一个节点
双向链表操作
1、链表是否为空
2、链表的长度
3、遍历链表
4、链表头部添加元素
5、链表尾部添加元素
6、链表指定位置添加元素
7、链表删除节点
8、查找节点是否存在
代码实现
# Functions 函数声明 class Node(): """实例化节点类""" def __init__(self, item): self.item = item self.prev = None self.next = None class Linklist(): """ 存放节点类 """ def __init__(self): self.head = None # 1. 链表是否为空 def is_empty(self): return self.head == None # 2. 链表的长度 def length(self): """ 返回链表中所有数据的个数 实例化游标,遍历链表,使用计数器自增一 空链表 """ # 实例化游标 cur = self.head # 判断是否为空 if self.is_empty(): return 0 else: # 不为空 # 定义计数 count = 1 while cur.next != self.head: count+=1 cur = cur.next return count pass # 3. 遍历链表 def travel(self): """ 遍历链表 实例化游标,遍历链表,每次输出节点的数据 空链表 只有头节点 """ # 实例化游标 cur = self.head # 判断是否为空 if self.is_empty(): return None else: # 不为空的情况 while cur.next != self.head: print(cur.item, end=' ') cur = cur.next print(cur.item) pass # 4. 链表头部添加元素 def add(self, item): """ 头节点添加 实例化节点, """ # 实例化节点 node = Node(item) # 实例化游标 cur = self.head # 判断是否为空 if self.is_empty(): node.next = node node.prev = node self.head = node else: # 链表不为空的情况 # 只有一个节点的情况 # node.next = self.head node.next = cur node.prev = cur if cur.next == self.head: # print(cur.item) cur.prev = node cur.next = node self.head = node elif cur.next != self.head: pro = self.head while cur.next != self.head: cur = cur.next pro.prev = node cur.next = node self.head = node pass # 5. 链表尾部添加元素 def append(self, item): """ 链表尾部添加数据 实例化节点,实例化游标,指向尾部节点,修改指向 链表为空 """ # 实例化节点 node = Node(item) # 实例化游标 cur = self.head if self.is_empty(): self.add(item) else: # 不为空的情况 # 指针指向最后一个节点 self.head.prev = node node.next = self.head while cur.next != self.head: cur = cur.next node.prev = cur cur.next = node pass # 6. 链表指定位置添加元素 def insert(self, index, item): """ 指定位置添加数据 实例化节点, 实例化游标 移动游标到索引位置,更改指向 输入索引大小判断 链表是否为空 """ # 实例化节点 node = Node(item) # 实例化游标 cur = self.head if index <= 0: self.add(item) elif index > (self.length()-1): self.append(item) else: # 中间添加数据 # 声明计数 count = 0 print(index) while count < index-1: count+=1 cur = cur.next # print(cur.item) node.next = cur.next node.prev = cur cur.next.prev = node cur.next = node pass # 7. 链表删除节点 def remove(self, item): """ 删除数据 实例化游标,遍历链表,查找有没有改数据 有,对改数据两侧的节点进行指向修改 """ # 实例化游标 cur = self.head # 判断是否为空 if self.is_empty(): return None else: # 不为空的情况下 # 如果删除的是头节点 if cur.item == item: # 如果只有一个头节点 if cur.next == self.head: self.head = None else: # self.head = cur.next pro = cur.next while cur.next != self.head: cur = cur.next cur.next = pro pro.prev = cur self.head = pro pass else: while cur.next != self.head: if cur.item == item: # print(cur.item) pro = cur.prev nex = cur.next pro.next = cur.next nex.prev = pro return True else: cur = cur.next # 如果是最后一个节点 if cur.item == item: cur.prev.next = self.head self.head.prev = cur.prev # 8. 查找节点是否存在 def search(self, item): """ 查询指定的数据是否存在 实例化游标 遍历所有的节点。每个节点中判断数据是否相等,相等,返回True """ # 实例化游标 cur = self.head # 判断是否为空 if self.is_empty(): return None else: # 不为空的情况 # 遍历所有的节点 while cur.next != self.head: if cur.item == item: return True else: cur = cur.next if cur.item == item: return True pass
测试运行
# 程序的入口 if __name__ == "__main__": a = Linklist() a .add(400) a .add(300) a .add(200) a .add(100) a.append(10) a.append(11) a.add(1) a.insert(30, 12) # 1 100 200 300 400 10 11 12 a.remove(1) # 100 200 300 400 10 11 12 a.remove(12) # 100 200 300 400 10 11 a.remove(400) # # 100 200 300 10 11 a.remove(4000) print(a.search(100)) # True print(a.search(11)) # True print(a.search(111)) # None print(a.is_empty()) # False a.travel() # 100 200 300 10 11 print(a.length()) # 5 pass
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了Python pluggy模块的用法,pluggy提供了一个简易便捷的插件系统,可以做到插件与主题功能松耦合,pluggy 是pytest,tox,devpi的核心框架文中通过代码示例演示给大家详细介绍,需要的朋友参考下吧
python怎么创建与遍历二叉树?对于二叉树内容,还是比较重要的,因此下面给大家分享使用递归的方式来实现python创建和遍历二叉树,需要的朋友可以参考学习。
这篇文章主要介绍了Python可视化神器pyecharts之绘制箱形图,箱形图(Box-plot)又称为盒须图、盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图,因形状如箱子而得名
这篇文章主要为大家介绍了Python的未来,python并发编程之未来模块Futures的详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
容器数据类型包括数组list,字典dict以及元组tuple等。本篇主要介绍了ChainMap字典序列的使用,需要的朋友们下面随着小编来一起学习学习吧
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008