约瑟夫环(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 指针即可。