单向循环链表其实就是在单向链表的基础上,让尾节点的下一个节点指向头节点,整个链表形成一个闭环。所以在整体思路上,和单向链表类似,只是在考虑问题时,需要考虑尾部节点指向头部节点的指针。
1.构造单向循环链表
1.1 构造节点
单向循环链表的节点与单向链表相同,因此,这部分的代码没有区别。
class Node(object):
"""节点"""
def __init__(self,item):
self.elem = item
# 创建Node时,还不存在下一个节点,因此默认指定为None
self.next = None
1.2 构造函数
作用:构造头节点
思路与单向链表相同
传入node时,由于是单向循环链表,因此node的next指针指向自身
class SingleLinklist(object):
"""单链表"""
def __init__(self,node=None):
# 单向循环链表创建头节点后,头节点末尾指向自身
self.__head = None
if node:
node.next = node
1.3 is_empty函数
作用:用于判断链表是否为空
思路和代码都与单向链表相同
def is_empty(self):
"""判断是否为空"""
return self.__head == None
1.3 length函数
作用:用于返回链表的长度
构建一个cur游标,起使指向头节点的位置,即cur = self.__head
创建一个计数器count,用于计算长度
单向循环链表的遍历条件为while cur.next != self.__head,由于遍历条件会少算一次【不算尾节点】,因此count需要从1开始计数
当cur的next指针所指的不是self.__head时遍历,每遍历一次,count+1,cur移动一个索引位置
def length(self):
"""返回长度"""
if self.is_empty():
return 0
# 建立一个游标,由于对链表进行遍历
# 当count = 0 时,可以解决链表为空的情况
cur = self.__head
# 区别单向链表,此时count需要从1开始
count = 1
while cur.next != self.__head:
count += 1
cur = cur.next
return count
1.4 travel函数
作用:遍历整个链表
创建一个cur游标,起使指向头节点的位置,即cur = self.__head
当cur的next指针所指的不是self.__head时遍历,打印当前cur所指的元素
由于while循环内不会打印尾节点的元素,因此退出循环后,要打印当前cur游标所处的尾节点的元素
【注意】
由于单向循环链表的遍历条件,因此都需要考虑链表为空的情况
当链表为空时,结束函数
def travel(self):
"""遍历列表"""
# 链表为空时直接结束
if self.is_empty():
return
cur = self.__head
while cur.next !=