单向循环链表的最后一个节点会指向第一个节点
class SingleLinkList(object):
'''单向循环链表'''
#构造一个单向循环链表
def __init__(self,node=None):
self.__head = node
#初始化时如果真传了一个节点,该节点既是第一个节点也是最后一个节点,所以它得指向自己
if node:
node.next = node
#判空,该功能和单链表一样
def is_empty(self):
'''链表是否为空'''
return self.__head == None
def length(self):
'''链表长度'''
#如果是空链表,直接返回0
if self.is_empty():
return 0
#不是空链表的情况
#创建cur游标,用来遍历节点
cur = self.__head
#count记录数量
count = 1
#cur走到最后一个节点时cur.next == self.__head
while cur.next != self.__head: #cur一直走到cur.next == self.__head时停止
count += 1
cur = cur.next
return count
def travle(self):
'''遍历整个链表'''
#如果是空链表,直接返回个None
if self.is_empty():
return
#如果不是空链表
cur = self.__head
while cur.next != self.__head #只要不是cur.next == self.__head(最后一个节点),cur就往下走
print(cur.elem,end=' ')
cur = cur.next
#cur走到最后,最后一步不会执行,也就是说最后一个节点的元素不会打印,需要手动打印
print(cur.elem)
def add(self,item):
'''头插法添加元素'''
node = Node(item)
#如果链表是空链表
if self.is_empty():
self.__head = node
#将node指向自己
node.next = node
#如果不是空链表
else:
cur = self.__head
while cur.net != self.__head:
cur = cur.next
#退出循环时,cur指向尾节点
#将新节点的next区域指向第一个节点
node.next = self.__head
#将self.__head指向新节点
self.__head = node
#将最后一个节点的next区域指向新节点
cur.next = self.__head
def append(self,item):
'''链表尾部添加元素,尾插法'''
node = Node(item):
if self.is_empty():
self.__head = node
node.next = node
else:
cur = self.__head
while cur.next != self.__head:
cur = cur.next
#将新节点的next区域指向头结点
node.next = self.__head
#将尾节点的next区域指向新节点
cur.next = node
def insert(self,pos,item):
'''指定位置添加元素'
:param pos 从0开始
''
if pos <= 0:
self.add(item)
elif pos > (self.length()-1):
self.append(item)
else:
pre = self.__head
#计数,每走一步+1
count = 0
#当pre走到要插入节点的前面,退出循环
while count < (pos-1):
count += 1
pre = cur.next
#当走到要插入位置时
#将新节点的next区域指向pre.next
node = Node(item)
node.next = pre.next
#将pre.next指向node
pre.next = node
def search(self,item):
'''查找节点是否存在'''
#如果是空链表
if self.is_empty():
return False
#不是空链表
cur = self.__head
while cur.next != self.__head: #判断条件没包括尾节点,只到尾节点的前一个
if cur.elem == item:
return True
else:
cur = cur.next
#退出循环时,cur正指着尾节点
if cur.elem == item:
return True
return False
def remove(self,item):
'''删除节点'''
#如果是空链表
if self.__head ==None:
return
cur = self.__head
pre = None
while cur.next != self.__head:
if cur.elem == item:
#如果此节点是头结点
if cur == self.__head:
#找尾节点,新建一个游标去找
rear = self.__head
while rear.next != self.__head:
rear = rear.next
#当退出循环时rear指向尾节点
#将头结点指向第二个节点
self.__head = cur.next
#将尾节点的next区域指向第二个节点
rear.next = self.__head
#如果是中间节点,逻辑和单链表是一样的
else:
pre.next = cur.next
return #删完后退出程序
else: #继续向下走
pre = cur
cur = cur.next
#当退出循环时,cur才指向尾节点,需要单独判断
if cur.elem == item:
#当只有一个节点时,pre是空,pre.next不存在,需要单独判断
if pre == None:
#将self.__head指向空
self.__head == None
else:
#将pre.next指向第一个节点cur.next
pre.next = cur.next