python循环链表_python算法与数据结构-循环链表(41)

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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值