约瑟夫环问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到k的那个人被杀掉;他的下一个人又从1开始报数,数到k的那个人又被杀掉;依此规律重复下去,直到圆桌周围的人只剩最后一个。
思路:把所有人放到一个列表里1-n,若报的数字不是k则把将其放到列表最后一个位置,若是k就把这个数字从列表中删掉;直到列表剩下一个人为止,代码如下:
def fun(n,k):
arr = list(range(1,n+1))
index = 0
while arr:
temp = arr.pop(0)
index += 1
if index==k:
print(temp)
index = 0
continue
arr.append(temp)
if len(arr)==1:
print(arr)
break
if __name__=='__main__':
fun(41,3)单向循环链表法
class Node(object):
'''结点'''
def __init__(self,elem):
self.elem = elem
self.next = None
class SingleCycleList(object):
'''单向循环链表'''
def __init__(self):
self.head = None
def append(self,elem):
node = Node(elem)
if self.head is None:
self.head = node
self.head.next = node
else:
cur = self.head
while cur.next!=self.head:
cur = cur.next
cur.next = node
node.next = self.head
def remove(self,item):
'''删除节点'''
cur = self.head
pre = None
while cur.next != self.head:
if cur.elem == item:
#头节点的情况
if cur == self.head:
rear = self.head
while rear.next != self.head:
rear = rear.next
rear.next = cur.next
self.head = cur.next
else:
#中间结点的情况
pre.next = cur.next
return
else:
pre = cur
cur = cur.next
#尾节点的情况和一个元素的情况
if cur.elem == item:
# 一个元素的情况
if cur == self.head:
self.head = None
# 尾节点元素的情况
else:
pre.next = self.head
# pre.next = cur.next
def josephus(self,k):
cur = self.head
index = 1
while cur != cur.next:
cur = cur.next
index += 1
if index == k:
self.remove(cur.elem)
print("%d-->"%cur.elem,end="")
index = 0
print(cur.elem)
if __name__=='__main__':
n = 41
k = 3
scl = SingleCycleList()
for i in range(1,n+1):
scl.append(i)
scl.josephus(3)版权声明:本文为mysteryflower原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。