python 用解决约瑟夫问题

# -*- coding: utf-8 -*-
'''
Created on 2017年8月8日
@author: Administrator
用python实现循环链表,解决约瑟夫问题
'''
class Person():
    def __init__(self,num,next = None):
        self.next = next
        self.num = num

def create_cyclelink(N):
    '''参数N:为人数 '''
    cur = Person('cur') #创建链表游标,
    tmp = None #用于存放最后一个节点
    if N == 1:
            p = Person(1)
            cur.next = p
            p.next = cur.next
            return cur
    for i in range(N):
        if i == 0:
            p = Person(i+1)
            cur.next = p
            tmp = p
        elif i < N -1:
            p = Person(i+1)
            tmp.next = p 
            tmp = tmp.next
        elif i == N-1:
            p = Person(i+1)
            tmp.next = p 
            tmp = tmp.next
            tmp.next = cur.next #将最后一个人的指针指向第一个人
    return cur

#p = create_cyclelink(10)
#print(p.num)
#while p.next:
#    print(p.next.num)
#    p = p.next

out = None

def johnson(N,K):
    '''
    N为人数
    K:数到为K的人出列
    ''' 
    cur = create_cyclelink(N)
    #print(cur.next.num)
    out = None
    print('出队顺序:')
    for i in range(N-1):
        for _ in range(K-1):
            cur = cur.next
        out = cur.next
        print(out.num)
        cur.next = out.next
    print('最后出队:',cur.next.num)    
johnson(10, 2)

打印结果:
出队顺序:
2
4
6
8
10
3
7
1
9
最后出队: 5

总结:解决约瑟夫问题,是循环链表数据结构的经典应用,循环链表是在顺序链表的基础上,让最后一个节点指针指向第一个节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

crystalnsd

万水千山总是情,支持一下行不行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值