循环链表是一种特殊的单链表。实际上,循环链表也很简单。它跟单链表唯一的区别就在尾结点。我们知道,单链表的尾结点指针指向空地址,表示这就是最后的结点了。而循环链表的尾结点指针是指向链表的头结点。从我画的循环链表图中,你应该可以看出来,它像一个环一样首尾相连,所以叫作“循环”链表。
is_empty() 判断链表是否为空
length() 返回链表的长度
travel() 遍历
add(item) 在头部添加一个节点
append(item) 在尾部添加一个节点
insert(pos, item) 在指定位置pos添加节点
remove(item) 删除一个节点
search(item) 查找节点是否存在
class Node(object):
"""节点"""
def __init__(self, item):
# item存放数据元素
self.item = item
# next是下一个节点的标识
self.next = None
创建单向循环链表类
class SinCycLinkList(object):
"""单项循环链表"""
# 空的单链表 self.__head = None
# 非空的单链表 node.next = node
def __init__(self, node=None):
self.__head = None
if node:
node.next = node
is_empty
def is_empty(self):
"""判断链表是否为空"""
if self.__head == None:
return True
else:
return False
length
def length(self):
"""返回链表的长度"""
# 空链表的情况下
if self.is_empty():
return 0
# cur游标 指向首节点 用来遍历
cur = self.__head # None
# is 对象 == 数值是否相等
count = 1
while cur.next != self.__head:
count += 1
# 将游标后移动一位
cur = cur.next
return count
travel
def travel(self):
"""遍历"""
# 空链表
if self.is_empty():
return None
cur = self.__head
while cur.next != self.__head:
# 结点中的数据
print(cur.item, end=' ')
cur = cur.next
# 退出循环的时候,cur指向尾结点,但是尾结点并没有打印
print(cur.item)
add
def add(self, item):
"""链表头部添加元素"""
# item 你要具体插入的数据
node = Node(item)
# 空链表
if self.is_empty():
self.__head = node
node.next = self.__head
else:
cur = self.__head # None
while cur.next != self.__head:
cur = cur.next
# 找到尾节点
# 添加的节点指向原先的头节点
node.next = self.__head
# __head指向node
self.__head = node
# 尾结点指向新的节点
cur.next = node
append
def append(self, item):
"""链表尾部添加元素"""
node = Node(item)
# 空链表
if self.is_empty():
self.__head = node
node.next = self.__head
else:
cur = self.__head
while cur.next != self.__head:
cur = cur.next
# 找到尾节点
# 将尾结点指向node
cur.next = node
# 将node指向__head
node.next = self.__head
insert
def insert(self, pos, item):
"""指定位置添加元素"""
# 头部插入
if 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
remove
def remove(self, item):
"""删除节点"""
# 空链表
if self.is_empty():
return
cur = self.__head
pre = None
# 头节点的元素就是要删除的元素
if cur.item == item:
# 链表中的节点不止一个
if cur.next != self.__head:
while cur.next != self.__head:
cur = cur.next
# 循环结束 cur 指向尾结点
cur.next = self.__head.next
self.__head = cur.next
else:
self.__head = None
# 第一个节点不是要删除的
else:
while cur.next != self.__head:
if cur.item == item:
# 删除
pre.next = cur.next
return
else:
# 游标继续往下走
pre = cur
cur = cur.next
if cur.item == item:
pre.next = cur.next
search
def search(self, item):
"""查找节点是否存在"""
if self.is_empty():
return False
cur = self.__head
while cur.next != self.__head:
if cur.item == item:
return True
else:
# 让游标继续执行
cur = cur.next
# 循环退出 cur指向尾节点
if cur.item == item:
return True
return False