基于python怎样实现双向链表,代码是什么
Admin 2022-08-19 群英技术资讯 268 次浏览
使用python实现双向链表,供大家参考,具体内容如下
双向链表: 指的是讲数据链接在一起,每个数据是一个节点,每一个节点都有一个数据区,两个链接区,分别链接上一个节点和下一个节点
数据区: 存放数据的地方
prev: 链接上一个节点
next: 链接下一个节点
双向链表操作
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 # 技术器 # 如果链表为空,不会进入循环,直接输出 0 count = 0 # 遍历所有的数据 while cur != None: count +=1 cur = cur.next return count # 3. 遍历链表 def treval(self): """ 遍历链表,获取所有的数据 使用游标,遍历整个链表,每次输出cur.item 的值 注意链表为空的情况, """ # 实例化一个游标 cur = self.head # 遍历链表 while cur != None: print(cur.item, end=' ') cur = cur.next print() # 4. 链表头部添加元素 def add(self, item): """ 头部添加数据 分析: 1、头部添加数据,链表为空时: self.head 指向node 2、链表不为空时: 先将node.next = self.head.next, 再讲 self.head = node """ # 实例化节点 node = Node(item) # 添加数据 # 判断链表是否为空 if self.is_empty(): # 为空,直接将self.head 指向node self.head=node else: # 不为空,先将noede node.next = self.head self.head.prev=node self.head=node # 5. 链表尾部添加元素 def append(self,item): """ 尾部添加数据 分析: 要先将指针指向尾部的节点 最后的节点的 cur.next = node, node.prev = cur """ # 实例化节点 node = Node(item) # 实例化游标 cur = self.head # 移动游标到最后一个节点 # 如果链表为空 # 直接使用头插法 if self.is_empty(): self.add(item) else: while cur.next != None: # cur.next 不为空,则进入循环, 上次循环,是进入上上个节点,但 将cur = cur.next,就指向了最后一个节点 cur = cur.next node.prev = cur cur.next = node # 6. 链表指定位置添加元素 def insert(self, index, item): """ 指定位置添加数据 分析 单链表中需要实例化两个有游标 双向链表,直接向指针指向索引的位置 将这个位置节点的 cur. """ # 实例化节点 node = Node(item) # 实例化游标 cur = self.head # 起始位置 count = 0 if index<=0: # 使用头插法 self.add(item) elif index > (self.length()-1): self.append(item) else: # 移动游标 while count < index: # 增加一 count += 1 # 移动游标到索引位置 cur = cur.next node.next = cur node.prev = cur.prev cur.prev.next = node cur.prev = node # 7. 链表删除节点 def remove(self,item): """ 删除指定的节点 首先实例化节点,遍历链表,找到该节点,删除该节点 """ # 实例化游标 cur = self.head # 遍历链表,找到该节点 while cur != None: if cur.item == item: if self.head == cur: self.head = cur.next if cur.next: cur.next.prev = None else: cur.prev.next = cur.next # 如果有下个节点,防止最后一个节点 if cur.next: cur.next.prev = cur.prev pass break else: cur = cur.next # # 8. 查找节点是否存在 def search(self, item): """ 查看节点是否存在 分析 遍历链表,查看每一个节点的数据区 空链表 只有头节点 只有尾节点 """ # 实例化一个游标 cur = self.head # 遍历链表 while cur != None: if cur.item == item: return True else: cur = cur.next return False
测试运行
# 程序的入口 if __name__ == "__main__": s = Linklist() print(s.is_empty()) # True s.append(100) s.append(200) s.append(300) s.add(6) s.insert(1, 10) s.search(6) s.treval() # 6 10 100 200 300 s.remove(100) s.treval() # 6 10 200 300 pass
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
爬取网页其实就是通过URL获取网页信息,网页信息的实质是一段添加了JavaScript和CSS的HTML代码。Python提供了一个抓取网页信息的第三方模块requests,requests模块自称“HTTP for Humans”,直译过来的意思是专门为人类而设计的HTTP模块,该模块支持发送请求,也支持获取响应。
这篇文章主要介绍了Python tuple方法和string常量,文章基于python的相关资料展开详细内容,对初学python的通知有一定的参考价值,需要的小伙伴可以参考一下
这篇文章主要介绍了python使用OpenCV获取高动态范围成像HDR,如何使用不同曝光设置拍摄的多张图像创建高动态范围图像HDR,下文吗更详细的内容介绍,需要的小伙伴可以参考一下
这篇文章主要介绍了python判定文件目录是否存在及创建多层目录,文章通过os模块、try语句、pathlib模块善终模块展开详细的内容,感兴趣的朋友可以参考一下
这篇文章主要介绍了Python列表1~n输出步长为3的分组实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008