环形链表约瑟夫问题

思想:
新编号(一定是1)推旧编号
公式1:【长度为i的链表编号与报数的关系】
编号=(报数m-1)%长度i+1
公式2:【新编号(长度i-1)与旧编号(长度i)之间的关系】
旧编号=(新编号-1+弹出编号s)%长度i+1
联合推出:
旧编号=(新编号+报数m-1)%长度i+1
公式1的推导
在这里插入图片描述
公式2的推导:
在这里插入图片描述
在这里插入图片描述
代码:

def live(head,m):
    if not head or head.next==head or m<1:
        return head
    cur=head
    ll=0                               #链表长度
    while cur!=head:
        ll+=1
        cur=cur.next
    weizhi=getlive(ll,m)        #获取最后活着的位置
    while ll!=0:                    #在链表中找出活着位置的节点
        head=head.next
        weizhi-=1
    head.next=head
    return head
    
def getlive(i,m):#旧
    if i==1:
        return 1
    return (getlive(i-1,m)+m-1)%i+1 #新
   

猜你喜欢

转载自blog.csdn.net/weixin_40876685/article/details/89057902