java模拟环形链表解决约瑟夫问题

此文是观看尚硅谷韩老师的数据结构与算法学习视频整理的笔记

约瑟夫问题描述

约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。又称“丢手绢问题”.)

Josephu(约瑟夫、约瑟夫环) 问题
Josephu 问题为:设编号为 1,2,… n 的 n 个人围坐一圈,约定编号为 k(1<=k<=n)的人从 1 开始报数,数到 m 的那个人出列,它的下一位又从 1 开始报数,数到 m 的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列

环形链表介绍

环形链表是另一种形式的链式存贮结构。它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环。

解决约瑟夫图解问题思路

构建环形链表思路

解决约瑟夫问题代码思路

代码演示(代码中有详细解释)

package com.fs.demo_2020_07_17_CircleSingleLinkedListTable;
/*
环形链表解决约瑟夫问题*/
public class CircleSingleLinkedListTable {public static void main(String[] args) {//测试一下CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList();//形成5个节点的环形链表
//        circleSingleLinkedList.addNode(5);
//        circleSingleLinkedList.showNode();System.out.println("-----------测试计算约瑟夫问题----------");//测试约瑟夫问题circleSingleLinkedList.countNode(1,2,5);}
}//创建一个环形的单向链表
class CircleSingleLinkedList{//创建一个first 节点,当前没有编号private Node first = null;//添加一个节点,构建成一个环形的链表public void addNode(int nums){//先对nums进行判断,if (nums<1){System.out.println("给定的nums的值请大于1");return;}//创建一个辅助指针,帮助构建环形链表Node curNode = null;//使用for来创建我们的环形链表for (int i = 1; i <= nums; i++) {//根据编号,来创建小孩节点Node node = new Node(i);//如果是第一个小孩,先让自己构成环if (i==1){//先让first指向第一个节点first = node;//然后让第一个 节点的next指向第一个节点,形成环形first.setNext(first);//让辅助指针也指向我们的第一个节点curNode = first;}else {//如果不是第一个节点了//就先让辅助指针指向的节点的下一个节点为当前循环创建的nodecurNode.setNext(node);//让当前循环创建的节点的下一个节点指向first,形成环形node.setNext(first);//最后让辅助指针指向循环创建的新的节点curNode = node;}}}//遍历当前的环形链表public void showNode(){//先判断链表是否为空if (first == null){System.out.println("没有任何节点,请给入正确的值,让链表形成环形");return;}//因为first在遍历的时候不能移动,我们还是需要使用一个辅助指针完成遍历Node curNode = first;//先让辅助指针指向头指针while (true){System.out.println("当前的节点编号为:"+curNode.getNum());if (curNode.getNext() == first){//当指针移动到最后一个节点的时候,那么这个节点的下一个节点是first,所以遍历完了break;}//否则就还有节点,那就将辅助指针移动到下一个节点curNode = curNode.getNext();}}/*** 根据用户输入的节点个数,解决节点出圈的循序,解决约瑟夫的问题* Josephu 问题为:设编号为 1,2,… n 的 n 个人围坐一圈,约定编号为 k(1<=k<=n)的人从 1 开始报数,数* 到 m 的那个人出列,它的下一位又从 1 开始报数,数到 m 的那个人又出列,依次类推,直到所有人出列为止,由* 此产生一个出队编号的序列。* @param startNum 表示从第几个小孩开始报数* @param countNum 表示数几下,就出列* @param nums  表示最初有多少个节点*/public void countNode(int startNum,int countNum,int nums){//创建链表addNode(nums);//先对数据进行校验if (first == null || startNum < 1 || startNum > nums ){System.out.println("请正确传入参数~~~");return;}//创建一个辅助指针curNode,事先应该指向环形链表最后这个节点Node curNod = first;while (true){if (curNod.getNext() == first){//说明辅助指针指向最后一个节点break;}//一直循环,直到辅助指针指向了最后一个节点curNod = curNod.getNext();}//节点因为first和curNod现在一个是指向头节点,一个是指向最后一个节点//当对节点进行计数的时候,从那个节点开始计数,假设我要从第二个节点开始计数,// 我就需要让first和curNod移动一位,那么就是startNum-1位for (int i = 0; i < startNum - 1; i++) {//让first移动startNum - 1位first = first.getNext();//让curNod移动startNum - 1位curNod = curNod.getNext();}//节点开始计数时候,让first和curNod同时移动 countNum -1 次,然后让first指向的节点断开(也就是出圈)//假设从1开始数数2下就出列,那么就是2号出列因为前面first指向的是1号,while (true){if (curNod == first){//说明环形链表只有一个节点break;}//让first和curNod同时移动 countNum -1 次for (int i = 0; i < countNum - 1; i++) {//移动first = first.getNext();curNod = curNod.getNext();}//这时first指向的节点,就是要出圈的节点System.out.println("当前first指向的出圈节点为:"+first.getNum());//将first指向first的下一个节点first = first.getNext();//在将辅助指针指向firstcurNod.setNext(first);}//循环完成后,那么就只有一个节点了,那样就会自己指向自己,就是最后一个出圈System.out.println("最后一个出圈的节点为:"+first.getNum());}}//创建一个类来表示一个节点
class Node {public int num;//当前节点数public Node next;//当前节点存储的下一个节点信息//提供构造方法来初始化这个节点信息public Node(int num) {this.num = num;}//提供get,set方法来获取Node对象public int getNum() {return num;}public void setNum(int num) {this.num = num;}public Node getNext() {return next;}public void setNext(Node next) {this.next = next;}
}

测试结果

java模拟单链表环形链表解决约瑟夫问题相关推荐

  1. 数据结构-链表-环形链表

    数据结构-链表-环形链表 环形链表就是将单链表的尾部指向头部,从而形成一个单方向的环形结构,环形链表中每个元素都可以是head,也都可以是尾部,这样就不用担心链表头指针遗失的问题,而且在遍历链表的时候 ...

  2. LeetCode-环形链表|+环形链表||

    环形链表 | 和 || 题型相似且 || 是 | 的升级版,故放一起. 1.题 | 如下: 2.题目分析: 返回的是一个布尔型的结果,如果有环返回true,无环返回false. 3.源代码: bool ...

  3. 环形链表环形链表 II

    文章目录 前言 1.141. 环形链表 证明为什么快指针一定为2步,慢指针一定为1步 1.当循环链表前的距离与循环链表后的距离相等时 2.当循环链表前的距离为循环链表后的距离的1/2 同种情况下,fa ...

  4. 【Java 数据结构 算法】宁可累死自己, 也要卷死别人 8 环形链表

    [Java 数据结构 & 算法]⚠️宁可累死自己, 也要卷死别人 8⚠️ 环形链表 概述 链表 环形链表 环形链表实现 Node 类 insert 方法 remove 方法 main 完整代码 ...

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

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

  6. Java中使用链表解决约瑟夫问题(丢手绢问题)

    文章目录 文章目录 前言 一.思路分析 二.代码实现 1.Chird类建立 2.链表创建 3.功能实现 总结 其他解决方式: Java中使用list解决约瑟夫问题https://blog.csdn.n ...

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

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

  8. 简洁明了!Java实现单向环形链表以解决约瑟夫环Josepfu问题

    文章目录 简单介绍 代码实现 简单介绍 如果把单链表的最后一个节点的指针指向链表头部,而不是指向NULL,那么就构成了一个单向循环链表,通俗讲就是让尾节点指向头结点. 单向环形链表应用场景:Josep ...

  9. 【算法-剑指 Offer】62. 圆圈中最后剩下的数字(环形链表;约瑟夫环;动态规划)

    剑指 Offer 62. 圆圈中最后剩下的数字 - 力扣(LeetCode) 发布:2021年9月12日12:18:52 问题描述及示例 0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每 ...

最新文章

  1. 直播协议的选择:RTMP vs. HLS
  2. 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式
  3. oracle11g memory_target,Oracle11g启动报:ORA-00845: MEMORY_TARGET not supported on this system
  4. senet-运行和结构篇
  5. 2019年三峡大学计算机考研名单,三峡大学2019硕士研究生复试录取方案
  6. 360云盘上传 计算机文件格式,360云盘怎么上传文件 360云盘上传文件方法
  7. EDM邮件群发:群发邮件不进垃圾箱的独家秘笈
  8. 中国颅骨固定系统行业市场供需与战略研究报告
  9. word2vec详解(一)
  10. 编程语言静态/动态类型,强/弱定义分类以及七种程序错误类型
  11. 深度学习:学习路线与规划
  12. 怎么做出可以卖的电路板
  13. 如何将QQ音乐SQ品质FLAC格式转换成MP3音乐
  14. 《Adobe Dreamweaver CS6中文版经典教程》——2.4 常用的HTML4代码
  15. 互联网公司招聘--京东--前端-2016年笔试题
  16. 前端收集(前端学习资源)
  17. L1-059 敲笨钟 (20 分) C语言
  18. dropbear 安装配置
  19. 将PDF文件中的表格转换成Excel怎么转换
  20. Linux交叉编译生成驱动模块.ko

热门文章

  1. 不负众望,窝窝世界新版放出(内测):P
  2. springboot actuator监控笔记
  3. vue子组件改变父组件的值
  4. Spark任务执行期间写临时文件报错导致失败
  5. Mybatis传递参数的三种方式
  6. buildroot的使用简介【转】
  7. Spring整合Hibernate。。。。
  8. Tomcat的安装及使用
  9. 使用MEF构建可扩展的Silverlight应用
  10. 17个实用的JavaScript数组和对象的方法