数据结构之单向环形列表解决josef问题
1.定义节点类
该节点类中只有孩子的编号,以及指向下一个节点的"指针"
package com.ebiz.list.josepfu;/*** @author YHj* @create 2019-07-17 22:21* 表示节点的类*/ public class Boy {private int no;private Boy next; //指向下一个节点public Boy(int no) {this.no = no;}public int getNo() {return no;}public void setNo(int no) {this.no = no;}public Boy getNext() {return next;}public void setNext(Boy next) {this.next = next;}@Overridepublic String toString() {return "我是第" + no + "个Boy";}}
2.定义单向链表类
需要注意的是,josef问题是头尾相连的,在这也就是最后一个节点需要指向第一个节点,如果只有一个节点,那么该节点需要指向节点本身.
解决josef问题,关键是理解最后的josef方法.
package com.ebiz.list.josepfu;/*** @author YHj* @create 2019-07-17 22:16* 环形单项链表*/ public class SingleCircleList {//创建一个first 节点 没有编号也可以为空private Boy firstBoy =new Boy(-1);//添加节点,构成环形链表 需要注意的是第一个节点需要指向节点本身public void add(int num){if (num < 1 ){System.out.println("编号不正确");return;}//创建辅助节点Boy temp=null;//添加节点for (int i = 1; i <=num ; i++) {Boy boy = new Boy(i);if (i == 1){ //代表第一个节点firstBoy=boy;firstBoy.setNext(firstBoy);temp=firstBoy; //辅助接点}else {temp.setNext(boy);boy.setNext(firstBoy); //这里不能为temp 因为是环形链表,后面逐渐增加的节点的next应该是头节点temp=boy;}}}//遍历环形链表public void list( ){if (firstBoy.getNo() == -1){System.out.println("该环形链表为空!");return;}//定义辅助指针Boy temp=firstBoy;while (true){System.out.println(temp);if (temp.getNext().getNo() == 1){break;}temp=temp.getNext();}}/*josepfu问题的实现根据用户的输入,生成小孩出圈的顺序k:从哪里开始m:数几下num:玩游戏的小孩的数量*/public void josepfu(int k,int m,int num){//数据校验if (k>num || k<1 || m<1 || num<1){System.out.println("参数输入有误");}if(firstBoy.getNo() == -1){System.out.println("链表节点为空!");}//创建辅助指针 帮助小孩完成出圈Boy temp=firstBoy;//循环遍历,将该辅助指针指向最后一个,即firstBoy前一个while (true){if(temp.getNext() == firstBoy){break;}temp=temp.getNext();}// 报数之前.让first 和temp移动到对应位置 在k处报数,让first和temp移动k-1,// 移动到开始报数的孩子身上for (int i = 1; i <=k-1 ; i++) {firstBoy=firstBoy.getNext();temp=temp.getNext();}while (true){if (firstBoy == temp){break;}//开始报数,第k个孩子,即firstBoy当前指向的孩子//报m个数,,从第k个孩子本身报数,所以firstBoy移动m-1次,temp也移动m-1次for (int i = 1; i <=m-1 ; i++) {firstBoy=firstBoy.getNext();temp=temp.getNext();}//上面循环结束时,firstBoy指向要出去的孩子System.out.printf("小孩%d出圈",firstBoy.getNo());//这是将firstBoy指向将要出去的孩子的下一位,并且temp的next指向他firstBoy=firstBoy.getNext();temp.setNext(firstBoy);}System.out.printf("最后留在圈中的小孩编号%d",firstBoy.getNo()); //或者temp }}
3. 写一个简单测试类
package com.ebiz.list.josepfu;/*** @author YHj* @create 2019-07-18 9:30*/ public class Test {public static void main(String[] args) {//创建环形链表SingleCircleList circleList = new SingleCircleList();//环形链表添加节点circleList.add(5);//遍历链表 circleList.list();circleList.josepfu(1,2,5);} }
有不懂的欢迎留言评论!
转载于:https://www.cnblogs.com/jiushixihuandaqingtian/p/11224328.html
数据结构之单向环形列表解决josef问题相关推荐
- (数据结构与算法)单向环形链表解决约瑟夫问题
约瑟夫(Josephu)问题 Josephu问题为: 设编号为1, 2,- n的n个人围坐一圈,约定编号为k (1<=k<=n) 的人从1开始报数,数到m的那个人出列,它的下一位又从1开始 ...
- 单向环形列表及应用场景(约瑟夫环)
一.环形列表: 二.构建一个单向的环形链表思路 1.先创建第一个节点让first指向该节点,并形成环形 2.后面当我们每创建一个新的节点,就把该节点,加入到己有的环形链表中即可 三.遍历环形链表 1. ...
- python数据结构与算法:单向循环列表
单向循环列表:python实现,及其对应的 增删查检 操作 ##################### P4.9-P4.12 循环链表 ########################### #cod ...
- 简洁明了!Java实现单向环形链表以解决约瑟夫环Josepfu问题
文章目录 简单介绍 代码实现 简单介绍 如果把单链表的最后一个节点的指针指向链表头部,而不是指向NULL,那么就构成了一个单向循环链表,通俗讲就是让尾节点指向头结点. 单向环形链表应用场景:Josep ...
- java模拟单链表环形链表解决约瑟夫问题
java模拟环形链表解决约瑟夫问题 此文是观看尚硅谷韩老师的数据结构与算法学习视频整理的笔记 约瑟夫问题描述 约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算 ...
- 数据结构与算法文章列表
前言 数据结构与算法文章列表主要内容包括:稀疏数组.单向队列.环形队列.单向链表.双向链表.环形链表.约瑟夫问题.栈.前缀.中缀.后缀表达式.中缀表达式转换为后缀表达式.递归.迷宫问题.八皇后问题.散 ...
- 丢手帕java_java基于双向环形链表解决丢手帕问题的方法示例
本文实例讲述了java基于双向环形链表解决丢手帕问题的方法.分享给大家供大家参考,具体如下: 问题:设编号为1.2--n的几个小孩围坐一圈,约定编号为k(1= 我们现在用一个双向环形链表来解这一问题. ...
- python中的列表是采用链式结构实现的_Python数据结构与算法之列表(链表,linked list)简单实现...
Python数据结构与算法之列表(链表,linked list)简单实现 Python 中的 list 并不是我们传统(计算机科学)意义上的列表,这也是其 append 操作会比 insert 操作效 ...
- 数据结构 (二) ----- 单向链表双向链表
相关文章: <数据结构 (一) ----- 数据结构基本概念&基于数组实现线性表> <数据结构 (二) ----- 单向链表&双向链表> 文章目录 单链表 一. ...
最新文章
- 直播「拯救」互联网?
- SAP-ABAP SmartForms之变量显示小技巧
- 一个按键控制数码管的开和关_三菱PLC数码管显示及按键控制实验
- competition in a limited resource
- leetcode108 将有序数组转换为二叉搜索树
- ionic打包中的那些坑
- Android loader 详解
- linux中vim怎么编辑文件内容,Linux 使用vim命令编辑文件内容
- linux静态ip解析花生壳域名
- 《java程序设计基础》使用Reader和Writer流类
- TortoiseSVN安装及导入已有SVN仓库
- 计算机英语教案模板,优秀全英文教案模板
- 【黄啊码】解决微信小程序showToast不显示
- 相同间距下,相邻层间耦合带来影响比同层间耦合更严重
- Bullet physics 引擎的官方文档翻译
- 有什么股票自动交易软件好用?
- Python 爬虫实战(三) 获取百度地图搜索结果
- 给fiash图片加链接
- python中登录基金账户获取基金数据
- FairyGUI摇杆
热门文章
- 小程序、vue 新闻上下轮播
- SpringBoot项目利用maven自定义打包结构
- grep搜索子目录中包含某字符串的特定文件
- React开发(166):ant design form 设置值
- Taro+react开发(70):flex布局
- React(76)--react 主题开发目录
- 前端学习(3079):vue+element今日头条管理-数据筛选处理
- 前端学习(3068):vue+element今日头条管理-上午总结
- 原生js实现tab栏切换效果
- [vue] 你了解什么是高阶组件吗?可否举个例子说明下?