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