单向循环链表只有对头结点和尾部结点有增删操作的时候跟单向链表不同
这里继承了之前的单向链表的类
实现代码:
from node import BaseNode
from single_linked_list import SingleLinkedList
class OneAwayLoopLinkedList(SingleLinkedList):
"""单向循环链表"""
def length(self):
# 如果链表为空
if not self.head:
return 0
# 获取头结点的下一个结点
node = self.head.next
# 用于记录链表的长度
length = 1
# 如果当前结点不等于头结点
while node != self.head:
# 长度加1
length += 1
# 将当前结点指向下一个结点
node = node.next
# 返回链表的长度
return length
def __str__(self):
"""
打印实例时的输出
:return:
"""
# 获取头结点
node = self.head
travel = "["
while node:
if node == self.head:
travel += str(node.item)
else:
travel += ", %r" % node.item
node = node.next
if node.next == self.head:
if node != self.head:
travel += ", %r" % node.item
break
return travel + "]"
def add(self, item):
"""从头部添加结点"""
# 创建结点
new_node = BaseNode(item)
if not self.head:
new_node.next, self.head = new_node, new_node
else:
node = self.head
while node.next != self.head:
node = node.next
node.next, new_node.next, self.head = new_node, self.head, new_node
def append(self, item):
"""从尾部添加"""
# 创建结点
new_node = BaseNode(item)
# 如果链表为空
if not self.head:
# (和从头部添加一样)
self.add(item)
else:
# 获取头部结点
node = self.head
# 获取尾部结点
while node.next != self.head:
node = node.next
node.next, new_node.next = new_node, self.head
def remove(self, item):
"""
根据值移除结点
只有删除头部的时候跟单向链表不同
"""
if self.head:
# 获取头结点
node = self.head
# 如果头结点即是要删除的结点
if node.item == item:
if self.length() == 1:
self.clear()
return
while node.next != self.head:
node = node.next
self.head, node.next = self.head.next, self.head.next
# self.head, node.next = self.head.next, self.head
return
while node.next != self.head:
# 如果当前结点的下一个结点是要删除的结点
if node.next.item == item:
node.next = node.next.next
return
node = node.next
# 如果以上条件都不满足 则说明值不在链表内
raise ValueError('item not in SingleLinkedList')
def search(self, item):
"""查询值item是否在链表中"""
if self.is_empty():
return False
# 获取头结点
node = self.head
if node.item == item:
return True
while node.next != self.head:
if node.next.item == item:
return True
node = node.next
return False