用Java解决约瑟夫环问题

本文介绍了约瑟夫环问题的两种实现方法:一种使用循环链表,另一种使用链表。通过具体的Java代码示例展示了如何模拟约瑟夫环问题,并给出了不同场景下的最终幸存者编号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述

package com.lyf.linkList;

/**
 * Created by fangjiejie on 2017/4/19.
 */
public class Josephus<T> {
    int n;//共有n个人
    int m;//数到m淘汰
    Node head=null;
    Node tail=null;
    class Node<T>{
        T data;
        Node next;

        public Node(T data, Node next) {
            this.data = data;
            this.next = next;
        }
    }
    public Josephus(int n, int m) {
        this.n = n;
        this.m = m;
        Node tmp= new Node(1,null);
        this.head=tmp;
        for(int i=2;i<=n;i++){
            tmp.next=new Node(i,null);
            tmp=tmp.next;
        }
        tail=tmp;
        tmp.next=head;
    }
    public Node  Kill(){
        int count=0;
        while(head!=tail){//循环链表中,当head==tail,且不为空,则只剩下一个节点
            if(++count==m){//如果报数为m,那么此时的head淘汰
                System.out.print("kill "+head.data+", ");
                tail.next=head.next;
                count=0;
            }else{
                tail=tail.next;//tail 一直定位在被淘汰的人的前一个位置
            }
            head=head.next;//head 定位在重新开始报数的人的位置,
        }
        return head;
    }

    public static void main(String[] args) {
        System.out.println("最后剩下了"+new Josephus<Integer>(15,3).Kill().data);
        System.out.println("最后剩下了"+new Josephus<Integer>(17,3).Kill().data);
        System.out.println("最后剩下了"+new Josephus<Integer>(41,3).Kill().data);
    }
}

结果:
kill 3, kill 6, kill 9, kill 12, kill 15, kill 4, kill 8, kill 13, kill 2, kill 10, kill 1, kill 11, kill 7, kill 14, 最后剩下了5
kill 3, kill 6, kill 9, kill 12, kill 15, kill 1, kill 5, kill 10, kill 14, kill 2, kill 8, kill 16, kill 7, kill 17, kill 13, kill 4, 最后剩下了11
kill 3, kill 6, kill 9, kill 12, kill 15, kill 18, kill 21, kill 24, kill 27, kill 30, kill 33, kill 36, kill 39, kill 4, kill 8, kill 13, kill 17, kill 22, kill 26, kill 31, kill 35, kill 1, kill 7, kill 14, kill 20, kill 28, kill 34, kill 2, kill 11, kill 23, kill 32, kill 5, kill 19, kill 37, kill 16, kill 38, kill 29, kill 10, 最后剩下了25

package com.lyf.offer;

/**
 * Created by fangjiejie on 2018/5/29.
 */
public class JosePhusHuan {
     public static class People{
        int val;
        People next=null;
        public People() {
        }
        public People(int val) {
            this.val = val;
        }
    }
    public static void main(String[] args) {
        People[] peoples=new People[39];
        peoples[0]=new People(1);
        for(int i=1;i<39;i++){
            peoples[i]=new People(i+1);
            peoples[i-1].next=peoples[i];
        }
        System.out.println(kill(peoples[0],39).val);
    }
    public static People kill(People people,int n){
        int count=1;
        People cur=people;
        System.out.print("此时人数为"+n+"---");
        System.out.print("前一个报数的人为"+"0---");
        System.out.print("报数的人为"+cur.val+"---");
        System.out.print("报数为"+count+"---");
        System.out.println();
        while (n!=1){
            count++;
            People pre=cur;
            cur=pre.next;
            System.out.print("此时人数为"+n+"---");
            System.out.print("前一个报数的人为"+pre.val+"---");
            System.out.print("报数的人为"+cur.val+"---");
            System.out.print("报数为"+count+"---");
            if(count==3){
                if(cur.next==null){
                    cur.next=people;
                }
                n--;
                count=0;
                pre.next=cur.next;
                System.out.print("此人"+cur.val+"已经自杀");
            }
            System.out.println();
        }
        return cur.next;
    }
}

结果:
此时人数为39—前一个报数的人为0—报数的人为1—报数为1—
此时人数为39—前一个报数的人为1—报数的人为2—报数为2—
此时人数为39—前一个报数的人为2—报数的人为3—报数为3—此人3已经自杀
此时人数为38—前一个报数的人为3—报数的人为4—报数为1—
此时人数为38—前一个报数的人为4—报数的人为5—报数为2—
此时人数为38—前一个报数的人为5—报数的人为6—报数为3—此人6已经自杀
此时人数为37—前一个报数的人为6—报数的人为7—报数为1—
此时人数为37—前一个报数的人为7—报数的人为8—报数为2—
此时人数为37—前一个报数的人为8—报数的人为9—报数为3—此人9已经自杀
此时人数为36—前一个报数的人为9—报数的人为10—报数为1—
此时人数为36—前一个报数的人为10—报数的人为11—报数为2—
此时人数为36—前一个报数的人为11—报数的人为12—报数为3—此人12已经自杀
此时人数为35—前一个报数的人为12—报数的人为13—报数为1—
此时人数为35—前一个报数的人为13—报数的人为14—报数为2—
此时人数为35—前一个报数的人为14—报数的人为15—报数为3—此人15已经自杀
此时人数为34—前一个报数的人为15—报数的人为16—报数为1—
此时人数为34—前一个报数的人为16—报数的人为17—报数为2—
此时人数为34—前一个报数的人为17—报数的人为18—报数为3—此人18已经自杀
此时人数为33—前一个报数的人为18—报数的人为19—报数为1—
此时人数为33—前一个报数的人为19—报数的人为20—报数为2—
此时人数为33—前一个报数的人为20—报数的人为21—报数为3—此人21已经自杀
此时人数为32—前一个报数的人为21—报数的人为22—报数为1—
此时人数为32—前一个报数的人为22—报数的人为23—报数为2—
此时人数为32—前一个报数的人为23—报数的人为24—报数为3—此人24已经自杀
此时人数为31—前一个报数的人为24—报数的人为25—报数为1—
此时人数为31—前一个报数的人为25—报数的人为26—报数为2—
此时人数为31—前一个报数的人为26—报数的人为27—报数为3—此人27已经自杀
此时人数为30—前一个报数的人为27—报数的人为28—报数为1—
此时人数为30—前一个报数的人为28—报数的人为29—报数为2—
此时人数为30—前一个报数的人为29—报数的人为30—报数为3—此人30已经自杀
此时人数为29—前一个报数的人为30—报数的人为31—报数为1—
此时人数为29—前一个报数的人为31—报数的人为32—报数为2—
此时人数为29—前一个报数的人为32—报数的人为33—报数为3—此人33已经自杀
此时人数为28—前一个报数的人为33—报数的人为34—报数为1—
此时人数为28—前一个报数的人为34—报数的人为35—报数为2—
此时人数为28—前一个报数的人为35—报数的人为36—报数为3—此人36已经自杀
此时人数为27—前一个报数的人为36—报数的人为37—报数为1—
此时人数为27—前一个报数的人为37—报数的人为38—报数为2—
此时人数为27—前一个报数的人为38—报数的人为39—报数为3—此人39已经自杀
此时人数为26—前一个报数的人为39—报数的人为1—报数为1—
此时人数为26—前一个报数的人为1—报数的人为2—报数为2—
此时人数为26—前一个报数的人为2—报数的人为4—报数为3—此人4已经自杀
此时人数为25—前一个报数的人为4—报数的人为5—报数为1—
此时人数为25—前一个报数的人为5—报数的人为7—报数为2—
此时人数为25—前一个报数的人为7—报数的人为8—报数为3—此人8已经自杀
此时人数为24—前一个报数的人为8—报数的人为10—报数为1—
此时人数为24—前一个报数的人为10—报数的人为11—报数为2—
此时人数为24—前一个报数的人为11—报数的人为13—报数为3—此人13已经自杀
此时人数为23—前一个报数的人为13—报数的人为14—报数为1—
此时人数为23—前一个报数的人为14—报数的人为16—报数为2—
此时人数为23—前一个报数的人为16—报数的人为17—报数为3—此人17已经自杀
此时人数为22—前一个报数的人为17—报数的人为19—报数为1—
此时人数为22—前一个报数的人为19—报数的人为20—报数为2—
此时人数为22—前一个报数的人为20—报数的人为22—报数为3—此人22已经自杀
此时人数为21—前一个报数的人为22—报数的人为23—报数为1—
此时人数为21—前一个报数的人为23—报数的人为25—报数为2—
此时人数为21—前一个报数的人为25—报数的人为26—报数为3—此人26已经自杀
此时人数为20—前一个报数的人为26—报数的人为28—报数为1—
此时人数为20—前一个报数的人为28—报数的人为29—报数为2—
此时人数为20—前一个报数的人为29—报数的人为31—报数为3—此人31已经自杀
此时人数为19—前一个报数的人为31—报数的人为32—报数为1—
此时人数为19—前一个报数的人为32—报数的人为34—报数为2—
此时人数为19—前一个报数的人为34—报数的人为35—报数为3—此人35已经自杀
此时人数为18—前一个报数的人为35—报数的人为37—报数为1—
此时人数为18—前一个报数的人为37—报数的人为38—报数为2—
此时人数为18—前一个报数的人为38—报数的人为1—报数为3—此人1已经自杀
此时人数为17—前一个报数的人为1—报数的人为2—报数为1—
此时人数为17—前一个报数的人为2—报数的人为5—报数为2—
此时人数为17—前一个报数的人为5—报数的人为7—报数为3—此人7已经自杀
此时人数为16—前一个报数的人为7—报数的人为10—报数为1—
此时人数为16—前一个报数的人为10—报数的人为11—报数为2—
此时人数为16—前一个报数的人为11—报数的人为14—报数为3—此人14已经自杀
此时人数为15—前一个报数的人为14—报数的人为16—报数为1—
此时人数为15—前一个报数的人为16—报数的人为19—报数为2—
此时人数为15—前一个报数的人为19—报数的人为20—报数为3—此人20已经自杀
此时人数为14—前一个报数的人为20—报数的人为23—报数为1—
此时人数为14—前一个报数的人为23—报数的人为25—报数为2—
此时人数为14—前一个报数的人为25—报数的人为28—报数为3—此人28已经自杀
此时人数为13—前一个报数的人为28—报数的人为29—报数为1—
此时人数为13—前一个报数的人为29—报数的人为32—报数为2—
此时人数为13—前一个报数的人为32—报数的人为34—报数为3—此人34已经自杀
此时人数为12—前一个报数的人为34—报数的人为37—报数为1—
此时人数为12—前一个报数的人为37—报数的人为38—报数为2—
此时人数为12—前一个报数的人为38—报数的人为2—报数为3—此人2已经自杀
此时人数为11—前一个报数的人为2—报数的人为5—报数为1—
此时人数为11—前一个报数的人为5—报数的人为10—报数为2—
此时人数为11—前一个报数的人为10—报数的人为11—报数为3—此人11已经自杀
此时人数为10—前一个报数的人为11—报数的人为16—报数为1—
此时人数为10—前一个报数的人为16—报数的人为19—报数为2—
此时人数为10—前一个报数的人为19—报数的人为23—报数为3—此人23已经自杀
此时人数为9—前一个报数的人为23—报数的人为25—报数为1—
此时人数为9—前一个报数的人为25—报数的人为29—报数为2—
此时人数为9—前一个报数的人为29—报数的人为32—报数为3—此人32已经自杀
此时人数为8—前一个报数的人为32—报数的人为37—报数为1—
此时人数为8—前一个报数的人为37—报数的人为38—报数为2—
此时人数为8—前一个报数的人为38—报数的人为5—报数为3—此人5已经自杀
此时人数为7—前一个报数的人为5—报数的人为10—报数为1—
此时人数为7—前一个报数的人为10—报数的人为16—报数为2—
此时人数为7—前一个报数的人为16—报数的人为19—报数为3—此人19已经自杀
此时人数为6—前一个报数的人为19—报数的人为25—报数为1—
此时人数为6—前一个报数的人为25—报数的人为29—报数为2—
此时人数为6—前一个报数的人为29—报数的人为37—报数为3—此人37已经自杀
此时人数为5—前一个报数的人为37—报数的人为38—报数为1—
此时人数为5—前一个报数的人为38—报数的人为10—报数为2—
此时人数为5—前一个报数的人为10—报数的人为16—报数为3—此人16已经自杀
此时人数为4—前一个报数的人为16—报数的人为25—报数为1—
此时人数为4—前一个报数的人为25—报数的人为29—报数为2—
此时人数为4—前一个报数的人为29—报数的人为38—报数为3—此人38已经自杀
此时人数为3—前一个报数的人为38—报数的人为10—报数为1—
此时人数为3—前一个报数的人为10—报数的人为25—报数为2—
此时人数为3—前一个报数的人为25—报数的人为29—报数为3—此人29已经自杀
此时人数为2—前一个报数的人为29—报数的人为10—报数为1—
此时人数为2—前一个报数的人为10—报数的人为25—报数为2—
此时人数为2—前一个报数的人为25—报数的人为10—报数为3—此人10已经自杀
25

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值