循环链表解决约瑟夫问题

前言

传说有这样一个故事,在罗马人占领乔塔帕特后,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;}}
}
  • 运行结果

循环链表解决约瑟夫问题相关推荐

  1. 循环链表解决约瑟夫环问题

    约瑟夫环问题可以简单的使用数组的方式实现,但是现在我使用循环链表的方法来实现,因为上午看到一道面试题规定使用循环链表解决约瑟夫环问题. 什么是约瑟夫环? "约瑟夫环是一个数学的应用问题:已知 ...

  2. c语言循环链表约瑟夫问题的时间复杂度,用单向循环链表解决约瑟夫问题算法优劣性分析.doc...

    用单向循环链表解决约瑟夫问题算法优劣性分析 用单向循环链表解决约瑟夫问题算法优劣性分析 摘要: 首先由简单问题引入约瑟夫问题,然后用单向循环链表解决约瑟夫问题,最后对模拟方法及数学方法的优劣性进行分析 ...

  3. 数据结构:循环链表解决约瑟夫问题

    约瑟夫问题 问题来历 循环链表进行模拟 思路 约瑟夫问题 问题来历 据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中, ...

  4. 使用循环链表解决约瑟夫环问题

    1.问题来源: 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一 ...

  5. 循环链表解决约瑟夫问题(简化版)

    http://blog.csdn.net/jw903/article/details/38965477 约瑟夫环是一个经典的数学的应用问题:已知N个人(以编号1,2,3...N分别表示)围坐在一张圆桌 ...

  6. 【C语言】循环链表解决约瑟夫环问题

    好玩的约瑟夫环:有M个人,编号分别为1到M,玩约瑟夫环游戏,最初时按编号顺序排成队列:每遍游戏开始时,有一个正整数报数密码N,队列中人依次围坐成一圈,从队首的人开始报数,报到N的人出列,然后再从出列的 ...

  7. 《恋上数据结构第1季》单向循环链表、双向循环链表以及约瑟夫环问题

    循环链表(CircleList) 链表的接口设计 单向循环链表 单向循环链表完整源码 双向循环链表 双向循环链表完整源码 双向循环链表解决约瑟夫环问题 如何发挥循环链表的最大威力? 静态链表 数据结构 ...

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

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

  9. 用java解决约瑟夫循环问题,Java实现循环列表解决约瑟夫环问题

    约瑟夫环:共有n个人围成一圈,从1开始报数,数到m的人出圈,求最后幸运者序号?? 下面用Java实现循环列表解决这个问题: package com.iteye.ljmdbc7a; import jav ...

  10. Java数据结构单向循环链表实现约瑟夫问题(丢手绢)

    环形链表 实例:使用环形链表解决约瑟夫问题(丢手绢) 构建一个单向环形链表思路 ​ 1)先创建第一个节点,让first指向该节点,并形成环形 ​ 2)加入环形链表 遍历环形链表 ​ 1)先让一个辅助指 ...

最新文章

  1. 微软BI 之SSIS 系列 - Lookup 组件的使用与它的几种缓存模式 - Full Cache, Partial Cache, NO Cache...
  2. java文件编译_【java】javac编译多个有依赖关系的java文件为class文件
  3. 深入理解== 和 equals 的区别
  4. Spring事务管理(二)-TransactionProxyFactoryBean原理
  5. docker 镜像修改的配置文件自动还原_基于Docker搭建Redis一主两从三哨兵
  6. 微信小程序unionid获取问题
  7. 第 5 章 会修电脑不会修收音机 —— 依赖倒转原则
  8. Atitit mysql redis mongodb 性能指标 目录 1.1. 二、 性能比较 1 1.2. 性能极高- Redis能读的速度是110000次/s,写的速度是81000次/s 2 1
  9. CTF 湖湘杯 2018 WriteUp (部分)
  10. spring-boot集成elastic-job 并实现http类型作业
  11. 三维点云数据处理软件供技术原理说明_三维点云数据获取方法及获取系统与流程...
  12. 【ACL2020】结果已出,录用论文抢先看!
  13. Netlog的数据库及LAMP架构
  14. 【HAVENT原创】kubernetes docker 常用指令
  15. vue echarts饼状统计
  16. 【前端技术】一篇文章搞掂:HTML
  17. NYOJ 题目239 月老的难题 (二分图最大匹配-匈牙利算法模板)
  18. 学习笔记:几种矩阵乘法(matmul product普通乘积、hadamard product矩阵点乘、kronecker product克罗内克积、斯特拉森矩阵乘法)
  19. Magic Firewall 简介
  20. 计算机机房的安全知识有哪些,计算机公共机房安全管理制度

热门文章

  1. 利用user-agent取得浏览器版本号
  2. 哈希表、哈希桶(C++实现)
  3. 华为公司是如何做绩效考核的
  4. webstorm连接github上传代码
  5. 杨辉三角相关性质以及组合数
  6. 计算机ps特效教程,PS教程:Photoshop制作模特水滴飞溅特效
  7. 思维破局:真正废掉一个人的,从来都不是一份稳定的工作
  8. 如何进行多平台整合,实现数据变现?
  9. 二分查找和三分求单峰函数极值
  10. ASP.NET Core 和 EF Core 系列教程——排序、筛选、分页和分组