约瑟夫环问题(丢手绢)

本文介绍了约瑟夫环问题的背景及其解决方案,通过使用单向环形链表来模拟问题过程。首先详细描述了问题描述,然后分析了解决思路,即利用链表节点来表示参与者,并按顺序出列。接着给出了代码实现,包括节点类、链表类以及测试主类。最后展示了代码运行结果。虽然还有其他方法(如数组)可解此题,但作者尚未给出实现。
摘要由CSDN通过智能技术生成

问题描述:

Josephu 问题:

设编号为 1,2,…… n 的n个人未作一圈,约定编号为 k (1<=k<=n)的人从1 1开始报数,数到 m 的那个人出列,它的下一位又从 1 开始报数,疏导 m 的那个人出列。依次类推,直到所有人出列为止,由此产生一个出队编号的序列。

思路分析:

可以使用单向环形链表来解决该类题目:
在这里插入图片描述
例如:当 n = 5, k = 1,m = 2,时
它的出列顺序依次是 2 -> 4 -> 1 -> 5 -> 3;

  • 第一步:先创建一个节点类,将单向环形链表的各个节点用类来封装,因为每个节点都包括 序号、next,因此就可以直接从某个特定的类表示,每次添加链表时,创建这个对象即可;
  • 第二步:创建一个单向环形链表类,里边包括 创建链表的方法、出链表的方法;
  • 第三步:主函数运行即可。
代码实现:

节点类

class BoyNode{
   
    private int no;
    private BoyNode next;

    public BoyNode(int no){
   
        this.no = no;
    }

    public int getNo() {
   
        return no;
    }

    public void setNo(int no) {
   
        this.no = no;
    }

    public BoyNode getNext() {
   
        return next;
    }

    public void setNext(BoyNode next) {
   
        this.next = next;
    }
}

链表类

class CircleSingleLinkedList{
   
    // 环形链表的第一个节点
    private BoyNode first = null;

    // 给定一个值 n 创建 大小为 n 的环形链表
    public void makeLinkedList(
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值