1、单向循环链表的定义
单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点。
2、单向循环链表的操作
(1)is_empty() 判断链表是否为空
(2)length() 返回链表的长度
(3)travel() 遍历
(4)add(item) 在头部添加一个节点
(5)append(item) 在尾部添加一个节点
(6)insert(pos, item) 在指定位置pos添加节点
(7)remove(item) 删除一个节点
(8)search(item) 查找节点是否存在
3、单向循环链表的操作实现
(1)节点实现
class Node(object):
"""节点"""
def __init__(self, item):
self.item = item
self.next = None
(2)is_empty() 判断链表是否为空
def is_empty(self):
"""判断链表是否为空"""
return self.__head is None
(3)length() 返回链表的长度
def length(self):
"""返回链表的长度"""
# 如果链表为空,则返回长度0
if self.is_empty():
return 0
count = 1
cur = self.__head
while cur.next != self.__head:
count += 1
cur = cur.next
return count
(4)travel() 遍历
def travel(self):
"""遍历列表"""
if self.is_empty():
return
cur = self.__head
print(cur.item, end=" ") # 输出第一个值
while cur.next != self.__head:
cur = cur.next # 从第二个开始打印
print(cur.item, end=" ")
print()
(5)add(item) 在头部添加一个节点
def add(self, item):
"""头部添加节点"""
node = Node(item)
if self.is_empty():
self.__head = node
node.next = node
else:
# 添加的节点指向__head(__head相连接的第一个节点)
node.next = self.__head
# 移动到链表尾部,将尾部节点的next指向node
cur = self.__head
while cur.next != self.__head:
cur = cur.next
cur.next = node
# __head指向添加的node
self.__head = node
(6)append(item) 在尾部添加一个节点
def append(self, item):
"""尾部添加节点"""
node = Node(item)
if self.is_empty():
self.__head = node
node.next = node
else:
# 移动游标cur到链表尾部
cur = self.__head
while cur.next != self.__head:
cur = cur.next
# 将原来的尾节点指向node
cur.next = node
# 将node指向头节点__head
node.next = self.__head
(7)insert(pos, item) 在指定位置pos添加节点
def insert(self, pos, item):
"""在指定位置添加节点"""
if pos <= 0:
self.add(item)
elif pos > self.length()-1:
self.append(item)
else:
node = Node(item)
cur = self.__head
count = 0
# 移动到指定位置的前一个位置
while count < pos-1:
count += 1
cur = cur.next
node.next = cur.next
cur.next = node
(8)remove(item) 删除一个节点
def remove(self, item):
"""删除一个节点"""
if self.is_empty():
return
cur = self.__head
pre = None
while cur.next != self.__head:
if cur.item == item:
# 先判断此节点是否为头节点
if cur == self.__head:
# 头节点的情况
# 找尾节点
rear = self.__head
while rear.next != self.__head:
rear = rear.next
self.__head = cur.next
rear.next = self.__head
else:
# 中间节点
pre.next = cur.next
return
else:
pre = cur
cur = cur.next
# 退出循环,cur指向尾节点
if cur.item == item:
if cur == self.__head:
# 链表只有一个结点
self.__head = None
else:
pre.next = self.__head
(9)search(item) 查找节点是否存在
def search(self, item):
"""查找节点是否存在"""
if self.is_empty():
return False
else:
cur = self.__head
# 验证第一个节点
if cur.item == item:
return True
# 从第二个开始验证
else:
while cur.next != self.__head:
cur = cur.next
if cur.item == item:
return True
return False
整体代码:
#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author: Administrator
@file: 12-4.py
@time: 2022/05/21
@desc:
"""
# 单向循环列表
class Node(object):
"""节点"""
def __init__(self, item):
self.item = item
self.next = None
class SCycLinkedList(object):
"""单向循环链表"""
def __init__(self, node=None):
self.__head = None
if node:
node.next = node
def is_empty(self):
"""判断链表是否为空"""
return self.__head is None
def length(self):
"""返回链表的长度"""
# 如果链表为空,则返回长度0
if self.is_empty():
return 0
count = 1
cur = self.__head
while cur.next != self.__head:
count += 1
cur = cur.next
return count
def travel(self):
"""遍历列表"""
if self.is_empty():
return
cur = self.__head
print(cur.item, end=" ") # 输出第一个值
while cur.next != self.__head:
cur = cur.next # 从第二个开始打印
print(cur.item, end=" ")
print()
def add(self, item):
"""头部添加节点"""
node = Node(item)
if self.is_empty():
self.__head = node
node.next = node
else:
# 添加的节点指向__head(__head相连接的第一个节点)
node.next = self.__head
# 移动到链表尾部,将尾部节点的next指向node
cur = self.__head
while cur.next != self.__head:
cur = cur.next
cur.next = node
# __head指向添加的node
self.__head = node
def append(self, item):
"""尾部添加节点"""
node = Node(item)
if self.is_empty():
self.__head = node
node.next = node
else:
# 移动游标cur到链表尾部
cur = self.__head
while cur.next != self.__head:
cur = cur.next
# 将原来的尾节点指向node
cur.next = node
# 将node指向头节点__head
node.next = self.__head
def insert(self, pos, item):
"""在指定位置添加节点"""
if pos <= 0:
self.add(item)
elif pos > self.length()-1:
self.append(item)
else:
node = Node(item)
cur = self.__head
count = 0
# 移动到指定位置的前一个位置
while count < pos-1:
count += 1
cur = cur.next
node.next = cur.next
cur.next = node
def remove(self, item):
"""删除一个节点"""
if self.is_empty():
return
cur = self.__head
pre = None
while cur.next != self.__head:
if cur.item == item:
# 先判断此节点是否为头节点
if cur == self.__head:
# 头节点的情况
# 找尾节点
rear = self.__head
while rear.next != self.__head:
rear = rear.next
self.__head = cur.next
rear.next = self.__head
else:
# 中间节点
pre.next = cur.next
return
else:
pre = cur
cur = cur.next
# 退出循环,cur指向尾节点
if cur.item == item:
if cur == self.__head:
# 链表只有一个结点
self.__head = None
else:
pre.next = self.__head
def search(self, item):
"""查找节点是否存在"""
if self.is_empty():
return False
else:
cur = self.__head
# 验证第一个节点
if cur.item == item:
return True
# 从第二个开始验证
else:
while cur.next != self.__head:
cur = cur.next
if cur.item == item:
return True
return False
if __name__ == "__main__":
sll = SCycLinkedList()
print(sll.is_empty())
print(sll.length())
print("*********************")
sll.add(10)
sll.add(20)
sll.add(30)
sll.travel()
print(sll.length())
print("*********************")
sll.append(100)
sll.append(200)
sll.travel()
print(sll.length())
print("*********************")
sll.insert(3, -2)
sll.insert(2, -9)
sll.travel()
print(sll.search(100))
print(sll.search(30))
print(sll.search(0))
print(sll.length())
print("*********************")
sll.remove(100)
sll.remove(30)
sll.travel()
print(sll.length())
print("*********************")
测试结果: