Python循环链表

Python循环链表

Python循环链表

链表:把数据通过“指针”连接起来,并标记一个head起点,方便增删改查

python链表类

#定义节点Node
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


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值