约瑟夫问题

本文介绍了约瑟夫环问题,涉及到一个n个人围坐形成的报数出列的序列。当n=5,k=1,m=2时,通过构建环形链表并遍历,结合出圈处理的算法,可以模拟此过程。文章提供了详细的代码实现,包括链表构建、遍历以及出圈节点的处理策略。

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

Josephu(约瑟夫、约瑟夫环)问题

概述:设编号为1,2,3,……n的n个人围坐一圈,约定编号为K(1<k<n)的人从1开始报数,数到m的那个人出咧,他的下一位又从1开始报数,数到m的那个人又出列,以此类推,知道所有人都出列为止,由此产生一个出队编号的序列。
n=5,既有5个人
k=1,即从第一个人开始报数
m=2,数两下
在这里插入图片描述

代码实现

构建一个单项的环形链表
1、先创建第一个节点,让first指向该节点,并形成环形。
2、后面当我们每创建一个新的节点,就把该节点加入到已有的环形链表当中即可。
遍历环形链
1、先让一个辅助指针指向first这个节点。
2、然后通过一个while循环遍历该环形链表即可curBoy.next=first就结束了

 package com.josepho;

public class JosePhe {
   
    public static void main(String[] args) {
   
        //测试环形链表
        CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList();
        circleSingleLinkedList.addBoy(5); //加入5个节点
        circleSingleLinkedList.showBoy();
    }
}

//创建一个环形的单向链表
class CircleSingleLinkedList{
   
    //创建一个first节点,当前没有编号
    private Boy first = null;
    //添加小孩节点,构建成一个环形的链表
    public void addBoy(int nums){
   
        //nums 做一个数据校验
        if (nums<2){
   
            System.out.println("nums的值是不对滴!");
            return;
        }
        Boy curBoy = null;//辅助指针,帮助构建一个环形链表
        //使用for循环来创建我们的环形链表
        for (int i=1;i<nums;i++){
   
            //根据编号创建小孩节点
            Boy boy = new Boy(i);
            //如果是第一个小孩
            if (i==1){
   
                first = boy;
                first.setNext(first);//构成一个环
                curBoy=first;//让curBoy指向第一个小孩
            }else {
   
                curBoy.setNext(boy);
                boy.setNext(first);
                curBoy=boy;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值