Python数据结构与算法:第3-11课时:单项循环列表定义、单项循环列表遍历、求长度。
尾节点的next指向了头节点。其余一样。
定义:
单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点。
操作
节点的构造和单链表是一样的。
节点代码实现:
class SingleNode(object):
"""单链表的结点"""
def __init__(self,item):
# _item存放数据元素
self.item = item
# _next是下一个节点的标识
self.next = None
单项循环链表构造代码:
class SinCycLinkedlist(object):
"""单向循环链表"""
def __init__(self,node = None):
self._head = None
if node:
node.next = node
判断是否为空链表:
def is_empty(self):
"""判断链表是否为空"""
return self._head == None
链表长度:
判断如果某个节点指向的下一个地址 就是 料头指向地址 ,那么就判断,到了链表的最尾部了。
由于判断是否到尾部的判断条件变了,所以count必须从1开始数数,但是这样有忽略了空表的情况,所以必须作特俗判断:
实现代码:
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
while cur.next != self._head:
print(cur.item)
cur = cur.next
print(cur.item)
#尾节点还没有打印,必须补上一句。