classNode(object):def __init__(self,elem):
self.elem=elem
self.next=NoneclassSingleLinkCir(object):def __init__(self,node=None):
self.__head =nodeifnode:
self.node= node #节点默认指向自己
defis_empty(self):return self.__head ==None"""遍历所有节点,并记录数据"""
deflength(self):ifself.is_empty():return0
cur= self.__headcount= 1
while cur.next != self.__head:#跳出循环条件,当当当前指针的下一指针指向头结点时证明此节点为为尾节点
cur =cur.next
count+= 1
returncountdeftravel(self):
cur= self.__head
if self.__head ==None:returnNoneelse:while cur.next != self.__head:print(cur.elem,end="")
cur=cur.nextprint(cur.elem)#当cur等于尾节点时,退出循环,但是尾节点的元素需要打印,所以退出循环时候进行打印
defadd(self,item):
node=Node(item)if self.is_empty():#判断链表是否为空
self.__head =node
node.next=nodeelse:
cur= self.__head
while cur.next != self.__head:
cur=cur.next
node.next= self.__headself.__head =node
cur.next=nodedefappend(self,item):
node=Node(item)#cur = self.__head
ifself.is_empty():
self.__head =node
node.next=nodeelse:
cur= self.__head
while cur.next != self.__head:
cur=cur.next#cur.next = node.next
node.next = self.__headcur.next=nodedefinsert(self,pos,item):if pos <=0:
self.add(item)elif pos > (self.length()-1):
self.append(item)else:
node=Node(item)
cur= self.__headcount=0ifis_empty():
self.__head ==node
node.next=nodeelse:while count
cur=cur.next
count+= 1node.next=cur.next
cur.next=nodedefsearch(self,item):
cur= self.__head
ifself.is_empty():returnFalsewhile cur.elem !=item:if cur.next !=self.__head:
cur=cur.nextelse:returnFalsereturnTruedefremove(self,item):ifself.is_empty():returncur= self.__headpre=Nonewhile cur.elem !=item:if cur.next != self.__head:
pre=cur
cur=cur.nextelse:returnFalseif cur == self.__head:#如果删除的是头结点,要找到尾节点,把尾节点的指向改为原来头结点的next
if self.length() != 1:#判段链表中是否只有一个节点,只有一个节点则引入尾节点,
rear_node = self.__head
while rear_node.next != self.__head:
rear_node=rear_node.next#pre.next = self.__head
self.__head =cur.next
rear_node.next= self.__head
#rear.next = cur.next
#self.__head= cur.next
else:#只有一个节点,删除唯一节点,
self.__head =Noneelse:#删除中间节点和尾节点
pre.next=cur.nextif __name__ == "__main__":
ll=SingleLinkCir()print(ll.is_empty())print(ll.length())
ll.append(1)print(ll.is_empty())print(ll.length())#ll.travel()
print("*" * 50)
ll.remove(1)
ll.append(2)
ll.add(8)
ll.insert(3,3)
ll.travel()
ll.append(100)
ll.travel()
ll.remove(100)
ll.travel()
ll.remove(8)
ll.travel()