Python---循环链表

                class Node():
                    def __init__(self,item):
                        #数据域
                        self.item=item
                        #"指针"域
                        self.next=None


                #定义链表
                class Cyclelinkedlist():
                    #链表长度大小
                    size=0
                    def __init__(self):
                        self.head=None


                    def is_empty(self):
                        return self.head is None


                    def length(self):
                        return self.size


                    #链表元素索引从0开始
                    def insert(self,index,item):
                        if index<0 or index>self.size:
                            print("out of range")
                            return
                        #插入头节点,由于是循环链表,则需要找到尾节点
                        if index==0:
                            #判空,刚开始创建链表,链中没有元素,self.head为Node,curr, 
                            #Node,无法进行下一个判断
                            if self.is_empty():
                                node=Node(item)
                                self.head=node
                                self.head.next=self.head
                            else:
                                #定义游标节点
                                curr=self.head
                                #找到尾节点
                                while curr.next != self.head:
                                    curr=curr.next
                                #新建节点
                                node=Node(item)
                                node.next=self.head
                                curr.next=node
                                #更新头节点
                                self.head=node
                        else:
                            #pre为要插入位置的前一个
                            pre=self.head
                            for i in range(index-1):
                                pre=pre.next
                            node=Node(item)
                            #curr为要插入节点位置
                            curr=pre.next
                            node.next=curr
                            pre.next=node
                        #长度自增一
                        self.size+=1

                    #尾插法
                    def append(self,item):
                        #直接调用insert函数
                        self.insert(self.size,item)
                        # curr=self.head
                        # while curr.next!=self.head:
                        #     curr=curr.next
                        # node=Node(item)
                        # node.next=self.head
                        # curr.next=node
                        # # 长度自增一
                        # self.size+=1


                    def remove(self,index):
                        if index<0 or index>self.size:
                            print("out of range")
                            return
                        #去除头节点,(麻烦一点,因为不仅要去除,而且还要更新头节点)
                        if index==0:
                            #找到尾节点
                            curr=self.head
                            while curr.next!=self.head:
                                curr=curr.next
                            #保存头结点的下一个
                            temp=self.head.next
                            #删除头节点
                            curr.next=self.head.next
                            #更新头节点
                            self.head=temp
                        #删除的不是头节点
                        else:
                            #找到要删除节点的前一个结点(前驱节点)
                            pre=self.head
                            for i in range(index-1):
                                pre=pre.next
                            #要删除节点temp
                            curr=pre.next
                            pre.next=curr.next#等价于pre.next=pre.next.next
                        #长度自减一
                        self.size-=1


                    def update(self,index,item):
                        if index<0 or index>self.size:
                            print("out of range")
                            return
                        curr=self.head
                        for i in range(index):
                            curr=curr.next
                        curr.item=item


                    def find(self,index):
                        curr=self.head
                        for i in range(index):
                            curr=curr.next
                        return curr.item


                    #与items()方法
                    def out(self):
                        curr=self.head
                        # #注意最后一个值不会被打印,
                        # while curr.next!=self.head:
                        #     print(curr.item,end=' ')
                        #     curr=curr.next
                        # print()
                        for i in range(self.size):
                            print(curr.item,end=' ')
                            curr=curr.next
                        print()




                if __name__=='__main__':
                    l=Cyclelinkedlist()
                    for i in range(10):
                        l.insert(i,i*10)
                    l.out()
                    #0 10 20 30 40 50 60 70 80 90
                    l.update(0,1314)
                    l.out()
                    #1314 10 20 30 40 50 60 70 80 90
                    print(l.find(0))
                    #1314
                    l.update(6,666)
                    l.out()
                    #1314 10 20 30 40 50 666 70 80 90
                    l.append(520)
                    l.out()
                    #1314 10 20 30 40 50 666 70 80 90 520

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值