python双向循环链表实例详解
作者:python-行者 发布时间:2023-08-04 04:53:06
标签: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
来源:https://blog.csdn.net/Dhaihaihai/article/details/111304544


猜你喜欢
- 有个朋友要求帮忙绘制堆叠柱状图,查阅了一些文档之后也算是完成了,只是一个小demo,下面我就记录一下。1.什么是堆叠柱状图与并排显示分类的分
- ——nodejs安装及环境配置1.nodejs官网,下载windows平台nodejs环境安装包(.msi格式),安装2.测试安装是否成功:
- 核心提示:本文针对mysql-noinstall版本,也就是解压缩版的安装配置应用做了个总结,这些操作都是平时很常用的操作。文章中不对mys
- 网络爬虫网络爬虫是指在互联网上自动爬取网站内容信息的程序,也被称作网络蜘蛛或网络机器人。大型的爬虫程序被广泛应用于搜索引擎、数据挖掘等领域,
- 当程序中出现错误时怎么解决?也就是我们所说的bug(缺陷),以及工作中如何对bug进行调试❤ 什么是bug(缺陷)软件缺陷就是通
- 发现问题在Anaconda配置好虚拟环境后,需要将环境添加进PyCharm中。(或者新建项目时,设置针对某一项目的运行环境),选择Conda
- 我们看一个现象:import pandas as pdtitanic = pd.read_csv('titanic_data.csv
- 如果你真正理解Javascript函数是如何调用工作的,那么就可以避免一些bug的发生; 首先让我们创建一个简单的函数,这个函数将在下文中使
- 为了实现挖掘,我们需要开发一个挖掘功能.挖掘功能需要在给定的消息字符串上生成摘要并提供工作证明.让我们在本章讨论这个.消息摘要函数我们将编写
- # coding=utf-8 from BeautifulSoup import BeautifulSoup, Tag, Navigable
- 一、uni-app介绍??uni-app??? 是一个使用 ? ?Vue.js?? 开发所有前端应用的框架,开发者编写一套代码,可
- 安装jieba库教程jieba库是一款优秀的 Python 第三方中文分词库,jieba 支持三种分词模式:精确模式、全模式和搜索引擎模式,
- 关联模型(多对多)多对多关系(抽象)例:一篇文章可能有多个关键词,一个关键词可能被多个文章使用。 关键词表:字段id主键字段keyword关
- MySQLMySQL的特点1、性能卓越,服务稳定,很少出现异常宕机;2、开放源代码无版本制约,自主性及使用成本低;3、历史悠久,社区和用户非
- 小小程序猿SQL Server认知的成长 1.没毕业或工作没多久,只知道有数据库、SQL这么个东东,浑然分不清SQL和Sql Server
- 数据库操作类的优点优点可以说是非常多了,常见的优点就是便于维护、复用、高效、安全、易扩展。例如PDO支持的数据库类型是非常多的,与mysql
- Python面向对象编程(一)Python面向对象编程(二)Python面向对象编程(三)一、isinstance和issubclassty
- Fuse.js是什么最近在项目里用到了Fuse.js做模糊查询,便对这个算法起了点好奇心,翻了翻源码。Fuse.js 是一个 JavaScr
- 编码问题response = requests.get(URL, params=params, he
- 前言众所周知,appsetting.json 配置文件是.Net 的重大革新之心,抛开了以前繁杂的xml文件,使用了更简洁易懂的json方式