问题如下(与分析)

构建思路

输入一个数,数到这个数的小孩出圈,出圈顺序的思路

代码实现

根据图解,来一步一步实现
  //根据用户输入,计算小孩出圈顺序/**** @param startNo 表示从第几个小孩开始数数* @param countNum 表示数几下出圈* @param nums 表示最初有多少小孩在圈中*/public void countBoy(int startNo, int countNum, int nums){//先对数据校验if (first == null || startNo<1 || startNo > nums){System.out.println("输入有误,重新输入");return;}//创建辅助指针,帮助出圈Boy helper = first;while (true){if (helper.getNext() == first){ //说明helper指向最后小孩节点break;}helper = helper.getNext();}//小孩报数前,先让first 和 helper 移动 k - 1 次for (int j = 0; j < startNo -1; j++){first = first.getNext();helper = helper.getNext();}//当小孩报数时,让first 和 helper 指针同时 移动 m - 1 次,然后出圈//这里是一个循环操作,直到圈中只有一个小孩while (true){if (helper == first){ //说明只有一个节点break;}//让first 和 helper 同时移动 countNum - 1for (int i = 0; i < countNum -1; i++){first = first.getNext();helper = helper.getNext();}//这时first指向的节点,就是要出圈的节点System.out.printf("小孩 %d 出圈\n",first.getNo());//出圈(删除first指向的节点)first = first.getNext();helper.setNext(first);}System.out.println("最后留在圈中的小孩编号:"+first.getNo());}
}

测试

CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList();circleSingleLinkedList.addBoy(5); //加入五个小孩节点//测试小孩出圈
circleSingleLinkedList.countBoy(1,2,5);结果:
小孩 2 出圈
小孩 4 出圈
小孩 1 出圈
小孩 5 出圈
最后留在圈中的小孩编号:3

完整代码

package DataStructures.LinkedList;/*** 约瑟夫问题*/
public class Josepfu {public static void main(String []args){CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList();circleSingleLinkedList.addBoy(5); //加入五个小孩节点//遍历//circleSingleLinkedList.showBoy();//测试小孩出圈circleSingleLinkedList.countBoy(1,2,5);}
}
//创建一个环形单向链表
class CircleSingleLinkedList{//创建一个first节点,当前没有编号private Boy first = null;//遍历环形链表public void showBoy(){//先判断是否为空if (first == null){System.out.println("链表为空");return;}//因为first不能动,要用辅助指针完成遍历Boy cur = first;while (true){System.out.printf("小孩的编号是:%d \n",cur.getNo());if (cur.getNext() == first){ //遍历完break;}cur = cur.getNext(); //后移}}//添加小孩节点,构建环形链表public void addBoy(int nums){//验证numsif (nums<1){System.out.println("nums的值不正确");return;}Boy cur = null; //辅助指针帮助构建环形链表//使用for来构建环形链表for (int i = 1; i <= nums; i++){//根据编号创建小孩节点Boy boy = new Boy(i);//如果是第一个小孩if (i == 1){first = boy;first.setNext(first); //构成一个环cur = first; //让cur指向第一个小孩,first不能动} else {cur.setNext(boy);boy.setNext(first);cur = boy;}}}//根据用户输入,计算小孩出圈顺序/**** @param startNo 表示从第几个小孩开始数数* @param countNum 表示数几下出圈* @param nums 表示最初有多少小孩在圈中*/public void countBoy(int startNo, int countNum, int nums){//先对数据校验if (first == null || startNo<1 || startNo > nums){System.out.println("输入有误,重新输入");return;}//创建辅助指针,帮助出圈Boy helper = first;while (true){if (helper.getNext() == first){ //说明helper指向最后小孩节点break;}helper = helper.getNext();}//小孩报数前,先让first 和 helper 移动 k - 1 次for (int j = 0; j < startNo -1; j++){first = first.getNext();helper = helper.getNext();}//当小孩报数时,让first 和 helper 指针同时 移动 m - 1 次,然后出圈//这里是一个循环操作,直到圈中只有一个小孩while (true){if (helper == first){ //说明只有一个节点break;}//让first 和 helper 同时移动 countNum - 1for (int i = 0; i < countNum -1; i++){first = first.getNext();helper = helper.getNext();}//这时first指向的节点,就是要出圈的节点System.out.printf("小孩 %d 出圈\n",first.getNo());//出圈(删除first指向的节点)first = first.getNext();helper.setNext(first);}System.out.println("最后留在圈中的小孩编号:"+first.getNo());}
}
//先创建一个Boy类,表示一个节点
class Boy{private int no;private Boy next;public Boy(int no){this.no = no;}public int getNo() {return no;}public void setNo(int no) {this.no = no;}public Boy getNext() {return next;}public void setNext(Boy next) {this.next = next;}
}

数据结构 - 链表(单向环形链表)(约瑟夫问题)相关推荐

  1. (数据结构与算法)单向环形链表解决约瑟夫问题

    约瑟夫(Josephu)问题 Josephu问题为: 设编号为1, 2,- n的n个人围坐一圈,约定编号为k (1<=k<=n) 的人从1开始报数,数到m的那个人出列,它的下一位又从1开始 ...

  2. 五、单向环形链表---实现约瑟夫(Josephu)问题

    使用单向环形链表实现约瑟夫(Josephu)问题 1.约瑟夫(Josephu)问题描述 Josephu 问题为:设编号为 1,2,- n 的 n 个人围坐一圈,约定编号为 k(1<=k<= ...

  3. 简洁明了!Java实现单向环形链表以解决约瑟夫环Josepfu问题

    文章目录 简单介绍 代码实现 简单介绍 如果把单链表的最后一个节点的指针指向链表头部,而不是指向NULL,那么就构成了一个单向循环链表,通俗讲就是让尾节点指向头结点. 单向环形链表应用场景:Josep ...

  4. LeetCode_链表_环形链表_141

    链表_环形链表_141 环形链表_141 题目连接:141. 环形链表 - 力扣(LeetCode) (leetcode-cn.com) 解题思想:快慢指针1.定义两个指针,快指针fast.慢指针sl ...

  5. 数据结构:单向环形链表

    约瑟夫问题 public class Josephus {public static void main(String[] args){SingleCircleLinkedList single = ...

  6. 约瑟夫(环)问题(Josephu)(单向环形链表)

    问题描述 代码实现 package com.atguigu.linkedlist;import com.sun.org.apache.bcel.internal.generic.NEW;/*** @创 ...

  7. php环形链表,PHP环形链表实现方法示例

    本文实例讲述了PHP环形链表实现方法.分享给大家供大家参考,具体如下: 环形链表是一种链式存储结构,类似于单链表.区别是环形链表的尾节点指向头节点. 从而形成一个环, 环形链表是一种非常灵活的存储结构 ...

  8. 数据结构之单向环形列表解决josef问题

    1.定义节点类 该节点类中只有孩子的编号,以及指向下一个节点的"指针" package com.ebiz.list.josepfu;/*** @author YHj* @creat ...

  9. 链表题目----5 相交链表 和 环形链表 和 返回链表开始入环的第一个节点

    相交链表 思路 链表交叉不可能是x型 因为有可能两个链表不等长,所以我们必须让他们从同一起跑位置去起跑 从同一起跑位置出发,依次比较每个结点的地址是否相同 /*** Definition for si ...

最新文章

  1. DFS(深度搜索最简单的应用)
  2. 飞书正式发布5.0版 推出飞书人事、合同、审批等多款新产品
  3. Markdown语法(一)标题段落分割线
  4. 【BZOJ4205】卡牌配对
  5. Qt中配置OpenCV
  6. Office批量打印精灵4.2入门教程
  7. Android 打开系统文件管理器选择文件
  8. linux程序图形关不了怎么办,ubuntu下卸载软件 linux关闭图形化界面
  9. 微型计算机的英文术语,计算机常见英语词汇解释
  10. 名帖116 文徵明 小楷《离骚经》
  11. Ps简单几步把人物图片转素描画
  12. 十大网页设计者必看的网站
  13. R语言入门之——箭头(<-)与等于号(=)的区别
  14. 刁肥宅手笔:纯C语言利用链栈实现从后缀表达式Array中顺序输入表达式并求值
  15. 从零开始建立机械臂URDF模型
  16. 51nod3054 听指挥打胜仗
  17. linux使用gaussian提交命令,使用Gaussian时的几个实用脚本和命令
  18. 表格数据深度学习框架-DeepTables
  19. 全国建筑市场监管公共服务平台JS逆向
  20. 串口服务器之虚拟串口篇

热门文章

  1. 小米范工具系列之二:小米范 web目录扫描器
  2. JS - 按钮倒计时
  3. 关于64位Linux配置android开发环境出现 No such file or directory
  4. [Leetcode][第312题][JAVA][戳气球][动态规划][记忆化搜索]
  5. [剑指offer][JAVA]面试题第[29]题[顺时针打印矩阵][数组]
  6. java 对象访问权限_Java面向对象编程之访问控制权限
  7. python画图模块_学习python画图模块plotnine:第一步安装
  8. linux重启memcache_Linux下的Memcache安装方法
  9. /etc/fstab和/etc/mtab的区别!
  10. vue 文件转换二进制_在vue中使用axios实现post方式获取二进制流下载文件(实例代码)...