#coding = utf-8
#单向循环链表
classNode:def __init__(self, new_data):#链表有效负载--数据
self.data =new_data#链表指针
self.next =Nonedefget_data(self):returnself.datadefset_data(self, new_data):
self.data=new_datadefget_next(self):returnself.nextdefset_next(self, new_next):
self.next=new_nextclassSingleCycleList:def __init__(self):
self.head=None#作头插入时,需要先判断是否为空列表, 需要要注意插入顺序,
defadd(self, item):#因为实现单链表时,可以统一方式作头插入,所以需要三行代码
#而作双向链表和循环链表时,要区别是否为空链表,所以插入的代码就变化了很多。(简单一行,复杂多行)
node =Node(item)ifself.is_empty():#循环列表,必定首尾相连
self.head =node
node.set_next(self.head)else:#添加的节点指向head
node.set_next(self.head)#移到链表尾部,将尾部节点的next指向node
current =self.headwhile current.get_next() !=self.head:
current=current.get_next()
current.set_next(node)#head指向添加node的
self.head =node#作尾插入时,需要先判断是否为空列表
defappend(self, item):
node=Node(item)ifself.is_empty():#循环列表,必定首尾相连
self.head =node
node.set_next(self.head)else:#移到链表尾部,此处不优美,尾插入,要使用prev,从head往前移动一下!!!!!
current =self.headwhile current.get_next() !=self.head:
current=current.get_next()#将尾节点指向node
current.set_next(node)#将node指向头节点_head
node.set_next(self.head)#指定位置插入节点
definsert(self, pos, item):#相当于头插入
if pos <=0:
self.add(item)#相当于尾插入
elif pos >=self.size():
self.append(item)else:
node=Node(item)
count=0
current=self.head#移动到指定位置的前一个位置
while count < pos - 1:
count+= 1current=current.get_next()#由于不是头尾,直接插入即可
node.set_next(current.get_next())
current.set_next(node)#删除指定节点数据
defremove(self, item):ifself.is_empty():returnprevious=None
current=self.headwhile current.get_next() !=self.head:#待删除节点如果找到
if current.get_data() ==item:#在找到节点之后,需要判断是否为首节点
#因为首节点时,还没有Previous这个变量
if current ==self.head:
rear=self.headwhile rear.get_next() !=self.head:
rear=rear.get_next()
self.head=current.get_next()
rear.set_next(self.head)#待删除节点在中间
else:
previous.set_next(current.get_next())return
#待删除节点如果还没有找到
else:
previous=current
current=current.get_next()#待删除节点在尾部
if current.get_data() ==item:#如果链表中只有一个元素,则此时prior为None,Next属性就会报错
#此时直接使其头部元素为None即可
if current ==self.head:
self.head=Nonereturnprevious.set_next(current.get_next())#查找指定数据是否存在
defsearch(self, item):
current=self.head
found=Falsewhile current.get_next() !=self.head:if current.get_data() ==item:
found=True
current=current.get_next()returnfounddefis_empty(self):return self.head isNonedef __len__(self):returnself.size()defsize(self):ifself.is_empty():return0
count=0
current=self.head#由于是循环单链表,需要一个中断循环的机制
while current.get_next() !=self.head:
count+= 1current=current.get_next()returncountdefshow(self):#因为是循环链表,遍历的方式和非循环的不一样的。
ifself.is_empty():returncurrent=self.headprint(current.get_data(), end=' ')while current.get_next() !=self.head:
current=current.get_next()print(current.get_data(), end=' ')print()if __name__ == '__main__':
s_list=SingleCycleList()print(s_list.is_empty())
s_list.add(5)
s_list.add(4)
s_list.add(76)
s_list.add(23)
s_list.show()
s_list.append(47)
s_list.show()
s_list.insert(0,100)
s_list.show()
s_list.insert(99, 345)
s_list.show()
s_list.insert(3, 222)
s_list.show()
s_list.remove(76)
s_list.show()print(s_list.search(23))
s_list.show()print(s_list.is_empty())print(s_list.size())print(len(s_list))