数据结构 - 链表(单向环形链表)(约瑟夫问题)
问题如下(与分析)
构建思路
输入一个数,数到这个数的小孩出圈,出圈顺序的思路
代码实现
根据图解,来一步一步实现
//根据用户输入,计算小孩出圈顺序/**** @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;}
}
数据结构 - 链表(单向环形链表)(约瑟夫问题)相关推荐
- (数据结构与算法)单向环形链表解决约瑟夫问题
约瑟夫(Josephu)问题 Josephu问题为: 设编号为1, 2,- n的n个人围坐一圈,约定编号为k (1<=k<=n) 的人从1开始报数,数到m的那个人出列,它的下一位又从1开始 ...
- 五、单向环形链表---实现约瑟夫(Josephu)问题
使用单向环形链表实现约瑟夫(Josephu)问题 1.约瑟夫(Josephu)问题描述 Josephu 问题为:设编号为 1,2,- n 的 n 个人围坐一圈,约定编号为 k(1<=k<= ...
- 简洁明了!Java实现单向环形链表以解决约瑟夫环Josepfu问题
文章目录 简单介绍 代码实现 简单介绍 如果把单链表的最后一个节点的指针指向链表头部,而不是指向NULL,那么就构成了一个单向循环链表,通俗讲就是让尾节点指向头结点. 单向环形链表应用场景:Josep ...
- LeetCode_链表_环形链表_141
链表_环形链表_141 环形链表_141 题目连接:141. 环形链表 - 力扣(LeetCode) (leetcode-cn.com) 解题思想:快慢指针1.定义两个指针,快指针fast.慢指针sl ...
- 数据结构:单向环形链表
约瑟夫问题 public class Josephus {public static void main(String[] args){SingleCircleLinkedList single = ...
- 约瑟夫(环)问题(Josephu)(单向环形链表)
问题描述 代码实现 package com.atguigu.linkedlist;import com.sun.org.apache.bcel.internal.generic.NEW;/*** @创 ...
- php环形链表,PHP环形链表实现方法示例
本文实例讲述了PHP环形链表实现方法.分享给大家供大家参考,具体如下: 环形链表是一种链式存储结构,类似于单链表.区别是环形链表的尾节点指向头节点. 从而形成一个环, 环形链表是一种非常灵活的存储结构 ...
- 数据结构之单向环形列表解决josef问题
1.定义节点类 该节点类中只有孩子的编号,以及指向下一个节点的"指针" package com.ebiz.list.josepfu;/*** @author YHj* @creat ...
- 链表题目----5 相交链表 和 环形链表 和 返回链表开始入环的第一个节点
相交链表 思路 链表交叉不可能是x型 因为有可能两个链表不等长,所以我们必须让他们从同一起跑位置去起跑 从同一起跑位置出发,依次比较每个结点的地址是否相同 /*** Definition for si ...
最新文章
- DFS(深度搜索最简单的应用)
- 飞书正式发布5.0版 推出飞书人事、合同、审批等多款新产品
- Markdown语法(一)标题段落分割线
- 【BZOJ4205】卡牌配对
- Qt中配置OpenCV
- Office批量打印精灵4.2入门教程
- Android 打开系统文件管理器选择文件
- linux程序图形关不了怎么办,ubuntu下卸载软件 linux关闭图形化界面
- 微型计算机的英文术语,计算机常见英语词汇解释
- 名帖116 文徵明 小楷《离骚经》
- Ps简单几步把人物图片转素描画
- 十大网页设计者必看的网站
- R语言入门之——箭头(<-)与等于号(=)的区别
- 刁肥宅手笔:纯C语言利用链栈实现从后缀表达式Array中顺序输入表达式并求值
- 从零开始建立机械臂URDF模型
- 51nod3054 听指挥打胜仗
- linux使用gaussian提交命令,使用Gaussian时的几个实用脚本和命令
- 表格数据深度学习框架-DeepTables
- 全国建筑市场监管公共服务平台JS逆向
- 串口服务器之虚拟串口篇
热门文章
- 小米范工具系列之二:小米范 web目录扫描器
- JS - 按钮倒计时
- 关于64位Linux配置android开发环境出现 No such file or directory
- [Leetcode][第312题][JAVA][戳气球][动态规划][记忆化搜索]
- [剑指offer][JAVA]面试题第[29]题[顺时针打印矩阵][数组]
- java 对象访问权限_Java面向对象编程之访问控制权限
- python画图模块_学习python画图模块plotnine:第一步安装
- linux重启memcache_Linux下的Memcache安装方法
- /etc/fstab和/etc/mtab的区别!
- vue 文件转换二进制_在vue中使用axios实现post方式获取二进制流下载文件(实例代码)...