
Java解决约瑟夫问题(单向循环链表)
构建循环链表:包含41个节点,分别存储1到41之间的值。 使用计数器:记录当前报数的值。 遍历链表:每次循环时,计数器递增。 判断计数器值:如果计数器为3,则删除当前节点并打印节点的值,重置计数器。 重复过程:直到所有节点都退出圈。
发布日期:2021-05-08 03:26:49
浏览次数:22
分类:精选文章
本文共 1481 字,大约阅读时间需要 4 分钟。
问题转换
41个人坐成一个圆圈,第一个人编号为1,第二个人编号为2,依此类推。编号为1的人开始从1报数,依次向后,报数到3的那个人退出圈;自退出那个人开始的下一个人再次从1开始报数,以此类推。最终退出的最后一个人的编号是多少?
解题思路
为了解决这个问题,我们可以使用循环链表来模拟报数过程。具体步骤如下:
代码实现
public class JosephTest { public static void main(String[] args) { // 创建循环链表 Node first = new Node(1, null); Node pre = first; for (int i = 2; i <= 41; i++) { Node newNode = new Node(i, null); pre.next = newNode; pre = newNode; } pre.next = first; // 闭合循环 int count = 0; Node current = first; Node before = null; while (current != before) { count++; if (count == 3) { // 删除当前节点 before.next = current.next; System.out.println(current.value + "退出"); // 重置计数器 count = 0; // 更新current到下一个节点 current = current.next != null ? current.next : first; before = before.next; } else { before = current; current = current.next != null ? current.next : first; } } } private static class Node { int value; Node next; Node(int value, Node next) { this.value = value; this.next = next; } }}
运行结果
最终退出的节点编号依次为16和31。通过这个过程,我们可以看出约瑟夫和他的朋友成功地避免了死亡,展示了他们的智慧和勇气。
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月08日 18时05分47秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Dijkstra算法的总结
2019-03-04
SpringCloud和SprinBoot之间的关系
2019-03-04
javascript定义变量及数据类型介绍
2019-03-04
C语言的运算符和表达式
2019-03-04
椭圆曲线密码系统——椭圆曲线
2019-03-04
Vue实现选项卡功能
2019-03-04
数据结构——链表
2019-03-04
【Python】面向对象,封装
2019-03-04
接口又是个啥?
2019-03-04
uni-app请求头中携带token
2019-03-04
常用的 Git 命令和小技巧(1)
2019-03-04
vue中接收后台的图片验证码并显示
2019-03-04
springboot入门(1)---整合MyBatis
2019-03-04
Vue入门学习笔记(1)
2019-03-04
趣谈win10常用快捷键
2019-03-04
数学建模(NO.18灰色预测)
2019-03-04
数学建模更新12(数学线性规划模型1)
2019-03-04
Android,SharedPreferences的使用
2019-03-04
JPEG压缩技术
2019-03-04
两款用于检测内存泄漏的软件
2019-03-04