【Java】三种方法实现约瑟夫环

背景

约瑟夫环(Josephus)问题的背景可以追溯到公元1世纪,当时犹太历史学家约瑟夫和他的同伴被罗马军队包围。为了避免被俘或杀害,他们决定通过自杀的方式结束生命。为了执行这个决定,他们围成一个圈,然后按照一定的规则来选择自杀的人,直到只剩下最后一个人。这个规则是每次报数到某个固定的数字时,就将当前的人杀掉,然后再由下一个人重新开始报数。

约瑟夫作为一个不愿意自杀的人,快速地计算出了一个位置,使得他成为了最后一个存活的人,从而有机会逃脱。这个问题后来被称为“约瑟夫环”问题,并被广泛应用于计算机科学和数学领域。

题目

已知 n 个人(以编号1,2,3 … n 分别表示)围成一圈。从编号为 1 的人开始报数,数到 m 的那个人出列;他的下一个人又从 1 开始报数,数到 m 的那个人又出列;依此规律重复下去,直到最后剩下一个人。要求找出最后出列的人的编号

方法一:单向循环链表

package com.mobai.study0220;

/**
 * @Author Mobai
 * @Date 2024/2/20 18:03
 * @Version 1.0
 */
class Node {
    int number; // 编号
    Node next; // 指向下一个节点的引用

    public Node(int number) {
        this.number = number;
        this.next = null;
    }
}

class JosephusCircle {
    Node head; // 链表头节点

    // 添加节点到单向循环链表
    public void addNode