思想:
新编号(一定是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 #新