java模拟单链表环形链表解决约瑟夫问题
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模拟单链表环形链表解决约瑟夫问题相关推荐
- 数据结构-链表-环形链表
数据结构-链表-环形链表 环形链表就是将单链表的尾部指向头部,从而形成一个单方向的环形结构,环形链表中每个元素都可以是head,也都可以是尾部,这样就不用担心链表头指针遗失的问题,而且在遍历链表的时候 ...
- LeetCode-环形链表|+环形链表||
环形链表 | 和 || 题型相似且 || 是 | 的升级版,故放一起. 1.题 | 如下: 2.题目分析: 返回的是一个布尔型的结果,如果有环返回true,无环返回false. 3.源代码: bool ...
- 环形链表环形链表 II
文章目录 前言 1.141. 环形链表 证明为什么快指针一定为2步,慢指针一定为1步 1.当循环链表前的距离与循环链表后的距离相等时 2.当循环链表前的距离为循环链表后的距离的1/2 同种情况下,fa ...
- 【Java 数据结构 算法】宁可累死自己, 也要卷死别人 8 环形链表
[Java 数据结构 & 算法]⚠️宁可累死自己, 也要卷死别人 8⚠️ 环形链表 概述 链表 环形链表 环形链表实现 Node 类 insert 方法 remove 方法 main 完整代码 ...
- java实现环形链表解决约瑟夫环问题
什么是环形链表? 环形链表就是单向链表的基础上让链表的首尾相连,形成一个环,这就是一个循环链表. 什么是约瑟夫环问题? 约瑟夫环如下: 约瑟夫问题是个著名的问题:N个人围成一圈,第一个人从1开始报数, ...
- Java中使用链表解决约瑟夫问题(丢手绢问题)
文章目录 文章目录 前言 一.思路分析 二.代码实现 1.Chird类建立 2.链表创建 3.功能实现 总结 其他解决方式: Java中使用list解决约瑟夫问题https://blog.csdn.n ...
- (数据结构与算法)单向环形链表解决约瑟夫问题
约瑟夫(Josephu)问题 Josephu问题为: 设编号为1, 2,- n的n个人围坐一圈,约定编号为k (1<=k<=n) 的人从1开始报数,数到m的那个人出列,它的下一位又从1开始 ...
- 简洁明了!Java实现单向环形链表以解决约瑟夫环Josepfu问题
文章目录 简单介绍 代码实现 简单介绍 如果把单链表的最后一个节点的指针指向链表头部,而不是指向NULL,那么就构成了一个单向循环链表,通俗讲就是让尾节点指向头结点. 单向环形链表应用场景:Josep ...
- 【算法-剑指 Offer】62. 圆圈中最后剩下的数字(环形链表;约瑟夫环;动态规划)
剑指 Offer 62. 圆圈中最后剩下的数字 - 力扣(LeetCode) 发布:2021年9月12日12:18:52 问题描述及示例 0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每 ...
最新文章
- 直播协议的选择:RTMP vs. HLS
- 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式
- oracle11g memory_target,Oracle11g启动报:ORA-00845: MEMORY_TARGET not supported on this system
- senet-运行和结构篇
- 2019年三峡大学计算机考研名单,三峡大学2019硕士研究生复试录取方案
- 360云盘上传 计算机文件格式,360云盘怎么上传文件 360云盘上传文件方法
- EDM邮件群发:群发邮件不进垃圾箱的独家秘笈
- 中国颅骨固定系统行业市场供需与战略研究报告
- word2vec详解(一)
- 编程语言静态/动态类型,强/弱定义分类以及七种程序错误类型
- 深度学习:学习路线与规划
- 怎么做出可以卖的电路板
- 如何将QQ音乐SQ品质FLAC格式转换成MP3音乐
- 《Adobe Dreamweaver CS6中文版经典教程》——2.4 常用的HTML4代码
- 互联网公司招聘--京东--前端-2016年笔试题
- 前端收集(前端学习资源)
- L1-059 敲笨钟 (20 分) C语言
- dropbear 安装配置
- 将PDF文件中的表格转换成Excel怎么转换
- Linux交叉编译生成驱动模块.ko