Josephu

该博客介绍了Josephu问题的Java实现,通过创建环形链表,设置开始计数位置、计数步长,模拟过程并输出出圈顺序。博客包含了CycLink类用于构建和操作链表,LianBiaoTest类用于测试,以及Person类表示链表节点。

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

package Josephu;

//构造环形链表
public class CycLink{
//    先定义一个指向链表第一个人的引用
//    指向第一个人的引用,不能动
    Person firstPerson=null;
    Person temp=null;
    
    int len=0;//表示共有几个人
    int k=0;
    int m=0;
//    设置m数几下
    public void setM(int m){
        this.m=m;
    }    
//    设置链表的大小
    public void setLen(int len){
        this.len=len;
    }
//    设置第几个人开始数数
    public void setK(int k){
        this.k=k;
    }
//    开始play
    public void play(){
        Person temp=this.firstPerson;
//        1.先找到开始数数的人
        for(int i=1;i<k;i++){
            temp=temp.nextPerson;            
        }
        while(this.len!=1){
//            2.数m下
            for(int j=1;j<m;j++){
                temp=temp.nextPerson;
            }
//            找到要出圈的前一个人
            Person temp2=temp;
            while(temp2.nextPerson!=temp){
                temp2=temp2.nextPerson;
            }
            System.out.println("出圈的人编号:"+temp2.nextPerson.num);
//            3.将数到m的人,退出圈
            temp2.nextPerson=temp.nextPerson;
//            让temp指向下一个数数的人
            temp=temp.nextPerson;
            this.len--;
        }
        System.out.println("最后出圈的人:"+temp.num);
    }
    
//    初始化环形链表
    public void createLink(){
        for(int i=1;i<=len;i++){
//            创建第一个人
            if(i==1){
                Person ch=new Person(i);
                this.firstPerson=ch;
                this.temp=ch;
            }else if(i==len){
//                继续创建人
                Person ch=new Person(i);
                temp.nextPerson=ch;
                temp=ch;
                temp.nextPerson=this.firstPerson;
            }else{
//                继续创建人
                Person ch=new Person(i);
                temp.nextPerson=ch;
                temp=ch;
            }
        }
    }
    
//    打印环形链表
    public void show(){
//        定义一个跑龙套
        Person temp=this.firstPerson;
        do{
            System.out.println(temp.num+"");
            temp=temp.nextPerson;
        }while(temp!=this.firstPerson);
    }
}

 

package Josephu;

public class LianBiaoTest {
    public static void main(String[] args) {
        CycLink cyclink=new CycLink();
        cyclink.setLen(10);//链表长度
        cyclink.createLink();//创建链表
        cyclink.setK(1);//从第几个开始数,从第二个人开始数
        cyclink.setM(3);//数几下
        cyclink.show();
        cyclink.play();
    }
}

 

package Josephu;


class Person{
    int num;//编号
    Person nextPerson=null;//引用类型,指向下一个人
    public Person(int num){
//        给一个编号
        this.num=num;
    }
}
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值