classNode():def __init__(self,num):
self.element=num
self.next=NoneclassCricleLinkList(object):def __init__(self):
self.head=None
self.length=0#1、判断是否为空
defis_empty(self):if self.head ==None:returnTrueelse:returnFalse#2、头部插入
defadd(self, num):#创建要插入的节点
node =Node(num)if self.is_empty()==True:#如果为空直接插入
self.head =node#并且把自身的next执行头结点
node.next =self.headelse:#将原来的头结点作为插入节点的next
node.next =self.head
current=self.head#循坏找到最后一个节点
while current.next !=self.head:
current=current.next#将最后一个节点的next执行插入节点
current.next =node#将插入的节点设置为头结点,完成循坏闭合
self.head =node#每次添加完成一次,长度加1
self.length += 1
#3、遍历
deftravel(self):if self.is_empty() ==True:print("你要遍历的循环链表为空")return
print("你要遍历的循环链表元素有:", end=" ")
current=self.head#先把第一个元素打印一下
print("%d" % current.element, end=" ")#打印只有一个元素的时候,第一个元素打印不出来,所以先把第一个打印出来
while current.next !=self.head:
current=current.nextprint("%d" % current.element, end=" ")print("")#4、尾部插入
defappend(self,num):
node=Node(num)if self.is_empty() ==True:
self.add(num)else:
current=self.headwhile current.next !=self.head:
current=current.next
node.next=self.head
current.next=node#每次添加完成一次,长度加1
self.length += 1
#5、指定位置插入
definsertAtIndex(self,num,index):if index<=0 or index>self.length+1:print("你要插入的位置不对,请重新选择位置")return
elif self.is_empty() ==True:
self.add(num)elif index==1:
self.add(num)elif index == self.length+1:
self.append(num)else:
current=self.headfor i in range(index-2):
current=current.next
node=Node(num)
node.next=current.next
current.next=node#每次添加完成一次,长度加1
self.length += 1
#6、按索引删除
defdeleteByIndex(self,index):if index<=0 or index>self.length:print("你要插入的位置不对,请重新选择位置")return
elif self.is_empty() ==True:print("你要删除的链表为空")return
elif index == 1:
current=self.headfor i in range(1,self.length):
current=current.next
current.next=self.head.next
self.head=self.head.nextelse:
current=self.headfor i in range(index-2):
current=current.next
current.next=current.next.next#每次删完长度减1
self.length -= 1
#7、查找是否包含,并返回位置
defisContain(self,num):if self.is_empty() ==True:print("你要查询的链表为空")return
else:
current=self.headfor i inrange(self.length):if current.element ==num:print("你要找到元素在第%d个节点"%(i+1))return i+1current=current.nextprint("没有找到你要的元素")return -1
#8、根据下标找节点
defsearchNodeByIndex(self,index):if index<=0 or index>self.length:print("你要查询的位置不对,请重新选择位置")return
elif self.is_empty() ==True:print("你要查询的链表为空")else:
current=self.headfor i in range(1,index):
current=current.nextprint("你要查找%d位置上的节点的值是%d"%(index,current.element))#9、根据下标修改节点的值
defmodifyByIndex(self,index,num):if index <= 0 or index >self.length:print("你要查询的位置不对,请重新选择位置")return
elif self.is_empty() ==True:print("你要修改的链表为空")else:
current=self.headfor i in range(1, index):
current=current.next
current.element=num#10、排序
defsort(self):if self.length<=0:return
for i in (0,self.length-1):
current=self.headfor j in range(0,self.length-i-1):if current.element>current.next.element:
temp=current.element
current.element=current.next.element
current.next.element=temp
current=current.nextif __name__ == '__main__':print("======1、创建循环链表 ======")
cricle_link_list=CricleLinkList()print("======2、验证是否为空 ======")
empty=cricle_link_list.is_empty()if empty ==True:print("你查询的链表为空")else:print("你查询的链表不为空")print("\n======3、验证头插和遍历 ======")
cricle_link_list.add(1)
cricle_link_list.travel()print("\n======4、继续验证头插和遍历 ======")
cricle_link_list.add(2)
cricle_link_list.travel()print("\n======5、验证尾插 ======")
cricle_link_list.append(3)
cricle_link_list.travel()print("\n======6、验证按位置插入 ======")
cricle_link_list.insertAtIndex(0,2)
cricle_link_list.travel()print("\n======7、验证按位置删除 ======")
cricle_link_list.deleteByIndex(5)
cricle_link_list.travel()print("\n======8、验证查找是否包含元素 ======")
cricle_link_list.isContain(2)print("\n======9、验证根据下标查找元素 ======")
cricle_link_list.searchNodeByIndex(3)print("\n======10、验证修改 ======")
cricle_link_list.modifyByIndex(3,5)
cricle_link_list.travel()print("\n======11、验证排序 ======")
cricle_link_list.sort()
cricle_link_list.travel()