循环链表解决约瑟夫问题
循环链表解决约瑟夫问题
前言
传说有这样一个故事,在罗马人占领乔塔帕特后,39 个犹太人与约瑟夫及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,第一个人从1开始报数,依次往后,如果有人报数到3,那么这个人就必须自杀,然后再由他的下一个人重新从1开始报数,直到所有人都自杀身亡为止。然而约瑟夫和他的朋友并不想遵从。于是,约瑟夫要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,从而逃过了这场死亡游戏 。
一、循环链表
循环链表,顾名思义,链表整体要形成一个圆环状。在单向链表中,最后一个节点的指针为null,不指向任何结点,因为没有下一个元素了。要实现循环链表,我们只需要让单向链表的最后一个节点的指针指向头结点即可。
二、约瑟夫问题解决思路
根据前言可知,约瑟夫问题就是一个循环链表,我们只需要把每次自杀的人的位置编号打印出来,看最后是哪两个位置最后自杀,就可以让约瑟夫和它的朋友站在相应的位置,最后剩余他两,就可以逃之夭夭了,从此过上幸福美满的生活,十年之后…
约瑟夫问题梳理
41个人坐一圈,第一个人编号为1,第二个人编号为2,第n个人编号为n。
1.编号为1的人开始从1报数,依次向后,报数为3的那个人退出圈;
2.自退出那个人开始的下一个人再次从1开始报数,以此类推;
3.求出最后退出的那个人的编号。代码实现
//约瑟夫问题
public class JosephTest {public static void main(String[] args) {//1. 创建循环链表Node<Integer> first=null; //第一个节点Node<Integer> curr=null; //当前节点for (int i=1;i<=41;i++){//如果是第一个节点if(i==1){first=new Node<>(i,null);curr=first;continue;}//如果是中间节点Node<Integer> newNode = new Node<>(i, null);curr.next=newNode;curr=newNode;//如果是最后一个节点if(i==41){curr.next=first;}}//2. 遍历循环链表,完成自杀过程curr=first; //遍历的当前节点Node<Integer> curr_before=null; //当前节点的上一个节点int count = 0; //计算器,模拟第几个人报数//因为是循环链表,当一个节点的下一个节点是自己时(证明只是剩下一个人),则遍历结束while (curr!=curr.next){count++;if(count==3){//1.如果count等于3.打印并删除该节点,count重置为0System.out.print(curr.item+",");curr_before.next=curr.next;curr=curr.next;count=0;}else{//2.如果count不等于3,这移动当前节点curr_before=curr;curr=curr.next;}}//打印最后一个数System.out.print(curr.item);}private static class Node<T>{T item;Node next;public Node(T item, Node next){this.item=item;this.next=next;}}
}
- 运行结果
循环链表解决约瑟夫问题相关推荐
- 循环链表解决约瑟夫环问题
约瑟夫环问题可以简单的使用数组的方式实现,但是现在我使用循环链表的方法来实现,因为上午看到一道面试题规定使用循环链表解决约瑟夫环问题. 什么是约瑟夫环? "约瑟夫环是一个数学的应用问题:已知 ...
- c语言循环链表约瑟夫问题的时间复杂度,用单向循环链表解决约瑟夫问题算法优劣性分析.doc...
用单向循环链表解决约瑟夫问题算法优劣性分析 用单向循环链表解决约瑟夫问题算法优劣性分析 摘要: 首先由简单问题引入约瑟夫问题,然后用单向循环链表解决约瑟夫问题,最后对模拟方法及数学方法的优劣性进行分析 ...
- 数据结构:循环链表解决约瑟夫问题
约瑟夫问题 问题来历 循环链表进行模拟 思路 约瑟夫问题 问题来历 据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中, ...
- 使用循环链表解决约瑟夫环问题
1.问题来源: 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一 ...
- 循环链表解决约瑟夫问题(简化版)
http://blog.csdn.net/jw903/article/details/38965477 约瑟夫环是一个经典的数学的应用问题:已知N个人(以编号1,2,3...N分别表示)围坐在一张圆桌 ...
- 【C语言】循环链表解决约瑟夫环问题
好玩的约瑟夫环:有M个人,编号分别为1到M,玩约瑟夫环游戏,最初时按编号顺序排成队列:每遍游戏开始时,有一个正整数报数密码N,队列中人依次围坐成一圈,从队首的人开始报数,报到N的人出列,然后再从出列的 ...
- 《恋上数据结构第1季》单向循环链表、双向循环链表以及约瑟夫环问题
循环链表(CircleList) 链表的接口设计 单向循环链表 单向循环链表完整源码 双向循环链表 双向循环链表完整源码 双向循环链表解决约瑟夫环问题 如何发挥循环链表的最大威力? 静态链表 数据结构 ...
- (数据结构与算法)单向环形链表解决约瑟夫问题
约瑟夫(Josephu)问题 Josephu问题为: 设编号为1, 2,- n的n个人围坐一圈,约定编号为k (1<=k<=n) 的人从1开始报数,数到m的那个人出列,它的下一位又从1开始 ...
- 用java解决约瑟夫循环问题,Java实现循环列表解决约瑟夫环问题
约瑟夫环:共有n个人围成一圈,从1开始报数,数到m的人出圈,求最后幸运者序号?? 下面用Java实现循环列表解决这个问题: package com.iteye.ljmdbc7a; import jav ...
- Java数据结构单向循环链表实现约瑟夫问题(丢手绢)
环形链表 实例:使用环形链表解决约瑟夫问题(丢手绢) 构建一个单向环形链表思路 1)先创建第一个节点,让first指向该节点,并形成环形 2)加入环形链表 遍历环形链表 1)先让一个辅助指 ...
最新文章
- 微软BI 之SSIS 系列 - Lookup 组件的使用与它的几种缓存模式 - Full Cache, Partial Cache, NO Cache...
- java文件编译_【java】javac编译多个有依赖关系的java文件为class文件
- 深入理解== 和 equals 的区别
- Spring事务管理(二)-TransactionProxyFactoryBean原理
- docker 镜像修改的配置文件自动还原_基于Docker搭建Redis一主两从三哨兵
- 微信小程序unionid获取问题
- 第 5 章 会修电脑不会修收音机 —— 依赖倒转原则
- Atitit mysql redis mongodb 性能指标 目录 1.1. 二、 性能比较	1 1.2. 性能极高- Redis能读的速度是110000次/s,写的速度是81000次/s	2 1
- CTF 湖湘杯 2018 WriteUp (部分)
- spring-boot集成elastic-job 并实现http类型作业
- 三维点云数据处理软件供技术原理说明_三维点云数据获取方法及获取系统与流程...
- 【ACL2020】结果已出,录用论文抢先看!
- Netlog的数据库及LAMP架构
- 【HAVENT原创】kubernetes docker 常用指令
- vue echarts饼状统计
- 【前端技术】一篇文章搞掂:HTML
- NYOJ 题目239 月老的难题 (二分图最大匹配-匈牙利算法模板)
- 学习笔记:几种矩阵乘法(matmul product普通乘积、hadamard product矩阵点乘、kronecker product克罗内克积、斯特拉森矩阵乘法)
- Magic Firewall 简介
- 计算机机房的安全知识有哪些,计算机公共机房安全管理制度