Python双向链表,python循环单链表的基本操作
本文主要详细介绍python双向循环链表的例子。本文中的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下。
用python实现双向循环链表,供大家参考。具体情况如下
双向链表:所有数据都存储在节点中,每个节点首尾相连,
每个节点有一个数据存储区和两个链接区,一个链接前一个节点,另一个链接下一个节点。
双向链表操作
1.链表是空的吗?
2.链表的长度
3.遍历链表
4.向链表的头部添加元素。
5.在链表的末尾添加元素。
6.在链表中的指定位置添加一个元素。
7.删除链表中的节点。
8.找出该节点是否存在。
代码实现
# Functions函数声明
类节点():
实例化节点类
def __init__(self,item):
self.item=项目
self.prev=无
self.next=无
类链表():
存储节点类
def __init__(self):
self.head=无
# 1.链表是空的吗?
定义为_空(自身):
返回self.head==None
# 2.链表的长度
定义长度(自身):
返回链表中所有数据的个数。
实例化游标,遍历链表,使用计数器加1。
空链表
#实例化光标
cur=self.head
#确定它是否为空。
if self.is_empty():
返回0
else:
#不为空
#定义计数
计数=1
下一个!=self.head:
计数=1
下一个
返回计数
及格
# 3.遍历链表
定义差旅(自助):
遍历链表
实例化游标,遍历链表,每次输出节点的数据。
空链表
只有头节点
#实例化光标
cur=self.head
#确定它是否为空。
if self.is_empty():
不返回
else:
#非空的情况
下一个!=self.head:
print(cur.item,end= )
下一个
打印(当前项目)
及格
# 4.向链表的头部添加一个元素
定义添加(自身,项目):
标题添加
实例化节点,
#实例化节点
节点=节点(项目)
#实例化光标
cur=self.head
#确定它是否为空。
if self.is_empty():
node.next=node
node.prev=节点
self.head=node
else:
#链表不为空的情况
#只有一个节点的情况
# node.next=self.head
node.next=cur
node.prev=cur
if cur.next==self.head:
#打印(当前项目)
cur.prev=节点
c
ur.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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持盛行IT软件开发工作室。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。