python 实现单项循环链表

python 实现单项循环链表

自定义单项循环链表
class Item(object):#定义链表的每一个节点
    def __init__(self,data,next=None,):
        self.data = data #编号
        self.next = next #用于指向下一个节点

class CycleLinkedList(object): #实现环形链表的主要结构与各功能
    def __init__(self):
        self.first = Item(None,next=None)#定义链表开始位置,方便遍历
        self.first.next = self.first

    def add(self,N,): #根据N值创建一个节点为N的环形链表
        sign = self.first
        for data in range(1,N+1):
            if sign.data == None:
                sign.data = data
            else:
                while True:
                    if sign.next == self.first:
                        break
                    sign = sign.next
                body = Item(data)
                sign.next = body
                body.next = self.first


    def move(self,K):#根据关键词K,将指针移到编号K位置,并且返回该指针
        sign1 = self.first #定位编号为K的节点
        sign2 = self.first #定位编号为K的节点的上一个节点,方便对链表进行操作
        while True:
            if sign2.next == self.first:
                break
            sign2 = sign2.next
        while K >1:
            sign1 = sign1.next
            sign2 = sign2.next
            K -= 1
        return sign1,sign2

    def pop(self,sign1,sign2,M):#按照当前节点从1开始计数,当计数为M的节点进行删除
        res = [] #收集删除的节点编号
        while sign1 != sign2:
            num = M
            while num > 1:
                sign1 =sign1.next
                sign2 = sign2.next
                num -= 1
            res.append(sign1.data)
            sign2.next = sign1.next
            sign1 = sign1.next
        res.append(sign1.data)
        return res
    def show(self):
        sign = self.first
        res = []
        while True:
            res.append(sign.data)
            if sign.next == self.first:
                break
            sign = sign.next
        return res

def main(N,K,M):
    peoples = CycleLinkedList()
    peoples.add(N)
    sign1,sign2 = peoples.move(K)
    print(peoples.pop(sign1,sign2,M))
if __name__ == '__main__':
    main(8,1,4)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值