约瑟夫环问题演示

返回主页

约瑟夫环(Josephus Problem)是一个经典的循环链表应用问题。

n 个人围成一圈,从第 1 个人开始报数,数到 m 的人出列;然后从下一个人重新开始报数,直到所有人出列。本工具使用循环链表实现,重点展示 current、prev 指针的移动与节点删除过程。

参数设置

取值范围 2~20

每次数到 m 的人出列

基本操作

动画设置

800ms

循环链表删除节点

核心操作:prev.next = current.next,让前驱节点跳过当前节点完成删除。

循环链表可视化

步骤: 0/0

出列顺序:

尚未开始...

操作日志

操作日志将显示在这里...

当前状态

总人数 n: 8
报数 m: 3
剩余人数: 8
已出列: 0
current: 1
prev: 8
当前报数: 1

循环链表实现约瑟夫环

class Node:
def __init__(self, value):
self.value = value
self.next = None
def josephus(n, m):
# 构建循环链表
head = Node(1)
current = head
for i in range(2, n + 1):
current.next = Node(i)
current = current.next
current.next = head # 首尾相连
prev = current
current = head
while current.next != current: # 只剩一人
for _ in range(m - 1):
prev = current
current = current.next
# 删除 current 节点
prev.next = current.next
current = current.next
return current.value

循环链表的最后一个节点指向头节点,形成闭环;删除节点时只需修改 prev 的 next 指针即可。