面试中可能经常会遇到约瑟夫环问题,逻辑上很简单,就是看怎么实现了,一般而言,最简单最直观的就是利用链表,然后构建一个循环结构,正好是环,最后计算出结果。

遍历环形链表会是一个无限循环,如果链表中的数据逐渐减少,不控制终究会一个不剩,这又不满足我们问题的求解,因此我们需要定义出循环结束的条件,按照约瑟夫环的规则,只剩下一个的时候就结束,在环形链表结构中,那就是结点本身的下一个节点就是它自己。这样就可以结束遍历了。最后打印出剩下的结点,问题解决。

这里给出Java版本的实现:

package com.xxx.algorithm.wh;
//约瑟夫环java实现
//约瑟夫环问题的起源来自犹太历史学家约瑟夫和他的朋友以及39其余的犹太人,总共41人为了躲避敌人,藏在一个山洞中,
//39个犹太人决定宁愿死也不被敌人抓到,于是决定自杀,所有人排成一个圈,由第一个人开始报数,每当数到3,就自杀。
//这个游戏接着从自杀的位置开始,还是从1数到3。依次类推,约瑟夫将朋友和自己安排在了16和31的位置,最后顺利逃过了
//自杀这一劫,因为最后就剩他一个人了。
public class JosefCircleMain {public static void count(int n){//数到3出局,中间间隔两个人int k = 3;//头结点不存储数据Node head = new Node();Node cur = head;//循环构造这个链表for(int i=1;i<=n;i++){Node node = new Node(i);cur.next = node;cur = node;}//链表有数据的部分首尾相连形成一个环。cur.next = head.next;//统计开始的时候,刨去头结点,然后从第一个有数据的结点开始报数Node p = head.next;//循环退出的条件是最后只剩一个结点,也就是这个结点的下一个结点是它本身while(p.next!=p){//正常报数的遍历逻辑for(int i=1;i<k-1;i++){p = p.next;}//当数到3的时候,出局System.out.print(p.next.data+"->");p.next = p.next.next;p = p.next;}//最后剩下的一个结点System.out.println("(left:"+p.data+")");}public static void main(String[] args) {//以4个人为例,1234 : 最先出局的是3,然后剩下412,接着2出局,剩下41,这时候就是4出局,最后剩下1.count(4);//41个人为例,就是约瑟夫环的本身了,最后剩下的是31count(41);}}class Node{int data;Node next;public Node(){}public Node(int data){this.data = data;}
}

一般的链表,如果没有特别的说明,头结点是有数据的,但是这里情况比较特殊,我们构建了一个头结点没有数据的空节点,然后将链表的首尾相连,这个首其实也不是头结点,而是头结点的下一个结点,用图表示就是如下:

首次遍历的时候,我们是从1开始的,所以代码中有这样的一句:

运行程序,打印结果:

3->2->4->(left:1)
3->6->9->12->15->18->21->24->27->30->33->36->39->1->5->10->14->19->23->28->32->37->41->7->13->20->26->34->40->8->17->29->38->11->25->2->22->4->35->16->(left:31)
打印结果既验证了只有4个结点的情况,也验证了约瑟夫环的本身的结论。

约瑟夫环问题链表实现(Java)相关推荐

  1. 链表基础操作 / 循环链表约瑟夫环/STL链表基本操作

    链表的基础操作 程序功能 输入几 就把几调到数最前面 程序步骤: 1.插入函数 2.初始化函数 3.删除节点 4.把排列展示出来 程序注意 不同函数的指针 不同 头指针定义为全局变量 代码实现截图 # ...

  2. 【LeetCode笔记】剑指 Offer 62. 圆圈中最后剩下的数字(Java、约瑟夫环、链表)

    文章目录 题目描述 思路 & 代码 链表模拟法 数学方法 二刷 题目描述 约瑟夫环!题目可太经典了 说实话还是有点难度的= = 思路 & 代码 链表模拟法 第一想法是用 LinkedL ...

  3. 【Java】单循环链表解决约瑟夫环问题

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

  4. 约瑟夫环问题2(顺序表+链表求解)

    1.背景知识 * 古代判官要判决number个罪犯的死刑,制定了一条荒谬的法律 * 将犯人站成一个圈,从start开始数起,每数到第distance * 个就处决他,依照此规律直到最后剩下一个人赦免. ...

  5. 映射递归循环-约瑟夫环问题递归解法的一点理解

    先说明一点,如果有什么不对的地方,欢迎大家批评指正. 先来看这个类型的某个题目描述: 约瑟夫生者死者游戏 约瑟夫游戏的大意:30个游客同乘一条船,因为严重超载, 加上风浪大作,危险万分.因此船长告诉乘 ...

  6. LeetCode 1823. 找出游戏的获胜者 (约瑟夫环)

    思路 下图所演示的是1 ~ n的情况,下标0 ~ n-1同样适用 李永乐约瑟夫环讲解 代码实现(java) class Solution {public int findTheWinner(int n ...

  7. java实现环形链表解决约瑟夫环问题

    什么是环形链表? 环形链表就是单向链表的基础上让链表的首尾相连,形成一个环,这就是一个循环链表. 什么是约瑟夫环问题? 约瑟夫环如下: 约瑟夫问题是个著名的问题:N个人围成一圈,第一个人从1开始报数, ...

  8. java 单链表约瑟夫环_java循环单链表实现约瑟夫环问题

    package SingleLinkList; //节点类 class Node{ private int data; private Node next; public int getData() ...

  9. 杀人游戏约瑟夫环(洛谷P1145题题解,Java语言描述)

    题目要求 题目链接P1145 约瑟夫环问题了解一下 约瑟夫环问题其实在数据结构里与单循环链表关系密切,但是这里模拟就完事~~ 我写过的约瑟夫环问题 AC代码(Java语言描述) import java ...

最新文章

  1. 这些年,在工作中摸索的我
  2. 浅析网站标题优化该如何进行?
  3. Python中的四种交换数值的方法
  4. leetcode 816. Ambiguous Coordinates | 816. 模糊坐标(Java)
  5. MySQL支持的四种索引_Mysql常见四种索引的使用
  6. Android Camera 3D效果
  7. python虚拟环境windows环境搭建_window10配置python虚拟环境的路径
  8. matlab电磁场与微波技术仿真pdf,MATLAB电磁场与微波技术仿真 清华大学出版社
  9. 网络抓包工具之Wireshark
  10. 6、厘米换算英尺英寸
  11. 没有mysql不能设置root密码怎么办_无法给MySQL root用户修改密码的解决方法
  12. MySQL 插入语句
  13. jquery php下拉列表,JQuery三级下拉菜单
  14. 西门子1513CPU冗余组态
  15. 服务器-Squid代理服务器及应用
  16. Very Deep Convolutional Networks for Large-Scale Image Recognition—VGG论文翻译—中文版
  17. ubuntu配置静态ip的方法
  18. Codeforece 990G. GCD Counting(点分治+暴力)
  19. 2022超nice的跨年烟花代码
  20. html5地图编辑器,XTranslator Map Editor(地图编辑器)

热门文章

  1. 怎样在win7系统建立telnet服务器,win7安装Telnet的方法
  2. win10关闭疑似病毒文件自动删除 功能关闭
  3. 什么是vuex?vuex如何使用?
  4. leetcode:1207. 独一无二的出现次数
  5. Latte Panda AlphaDelta上电自启动刷机教程
  6. oracle 12C数据库PSU补丁安装
  7. java rgb yuv_RGB和YUV简单学习记录
  8. python网页优化_400% 的飞跃-web 页面加载速度优化实战
  9. 美尼尔综合征的症状是什么?
  10. c语言旅馆信息管理系统,C语言旅馆信息管理系统简介.doc