Python单向循环链表完整实现与操作详解
本文详细介绍Python中单向循环链表的实现原理及核心操作方法。通过Node和Linklist类的定义,演示了判断链表是否为空、获取链表长度、遍历节点、头部/尾部/指定位置添加元素、删除节点及查找节点等完整功能。代码包含完整的类定义与测试用例,帮助开发者深入理解循环链表的逻辑结构与编程实现。
Python单向循环链表概述
本文将通过Python代码实例,详细解析单向循环链表的实现方法,供读者参考学习。
单向循环链表结构解析
单向循环链表的基本概念
在单向循环链表中,所有节点首尾相连形成闭环。每个节点由两部分组成:数据存储区和链接区。数据区用于存放实际数据,链接区则指向下一个节点。
其中,用于存储数据,用于指向下一个节点。需要特别注意的是,单向循环链表的关键特征在于首尾相连,即尾节点的链接区必须指向头节点,从而形成闭环结构。
单向链表核心操作方法
单向链表的核心操作
单向循环链表主要支持以下八种基本操作:1. 判断链表是否为空;2. 获取链表的长度;3. 遍历链表中的所有元素;4. 在链表头部添加元素;5. 在链表尾部添加元素;6. 在指定位置添加元素;7. 删除指定节点;8. 查找节点是否存在。
代码实现与测试
具体代码实现
# Functions 函数声明
class Node():
"""实例化节点类"""
def __init__(self, item):
self.item = item
self.next = None
class Linklist():
"""
存放节点类
"""
def __init__(self):
self.head = None
# 1. 链表是否为空
def is_empty(self):
return self.head == None
# 2. 链表的长度
def length(self):
"""
返回链表的长度
遍历所有的节点,使用计数器计数
1、链表为空情况
"""
# 实例化节点
cur = self.head
if self.is_empty():
return 0
else:
# 计数
count = 1
# 遍历链表
while cur.next != self.head:
count+=1
cur = cur.next
return count
# 3. 遍历链表
def travel(self):
"""
遍历链表,获取所有的数据
实例游标,遍历数据,输出数据
1、 空链表情况
2、 只有头部节点情况
3、 只有尾部节点情况
"""
# 实例化游标
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)
# 4. 链表头部添加元素
def add(self, item):
"""
往链表头部添加数据
分析
链表为空
self.head 直接指向node, 再讲node指向自己
链表不为空
node.next = self.head
"""
# 实例化游标
cur = self.head
# 实例化节点
node = Node(item)
# 判断是否为空
if self.is_empty():
self.head = node
node.next = node
else:
# 不为空的情况
# 要将最后一个节点指向node
while cur.next != self.head:
cur = cur.next
node.next = self.head
self.head = node
cur.next = node
# 5. 链表尾部添加元素
def append(self, item):
"""
往尾部添加数据
分析
实例化节点,再实例化游标先指向最后一个节点
调换指向
1、空链表情况
2、只有一个链表情况
"""
# 实例化节点
node = Node(item)
# 实例化游标
cur = self.head
# 判断是否为空
if self.is_empty():
self.add(item)
else:
# 不为空的情况,移动游标指向最后一个节点
while cur.next != self.head:
cur = cur.next
node.next = self.head
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:
# 判断链表是否为空
if self.is_empty():
self.add(item)
else:
# 移动游标,指向指定的索引位置
count = 0
while count < index-1:
count+=1
cur = cur.next
node.next = cur.next
cur.next = node
pass
# 7. 链表删除节点
def remove(self, item):
"""
删除指定的节点
实例化游标,遍历链表插件这个节点是否存在,存在则更改指向
不存在,则不修改
空链表情况
头节点情况
尾结点情况
"""
# 实例化游标
cur = self.head
if self.is_empty():
return None
else:
# 不为空,遍历链表,对比数据是否相等
# 如果头节点是要删除的数据
if cur.item == item:
self.head=cur.next
# 找出最后的节点,将最后的节点指向,删除后面的那个节点
while cur.next != self.head:
cur = cur.next
cur.next = cur.next
else:
pro = None
while cur.next != self.head:
if cur.item == item:
if cur.item == item:
pro.next = cur.next
return True
else:
pro = cur
cur = cur.next
if cur.item == item:
pro.next = self.head
pass
# 8. 查找节点是否存在
def search(self, item):
"""
查找该节点是否存在
实例化游标,遍历所有的节点
查看当前节点的数据是否和item 相等
空链表
头节点
尾结点
"""
# 实例化游标
cur = self.head
# 判断空链表
if self.is_empty():
return None
else:
# 不为空遍历整个链表
if cur.item == item:
return True
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.insert(4,6)
# a.remove(6)
print(a.length()) # 5
a.travel() # 100 200 300 400 6
print(a.search(100)) # True
pass以上内容为本文的全部介绍,希望能为读者的学习提供有益帮助。欢迎大家继续支持本站获取更多技术资源。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









