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问题相关推荐

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

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

  2. 单向环形列表及应用场景(约瑟夫环)

    一.环形列表: 二.构建一个单向的环形链表思路 1.先创建第一个节点让first指向该节点,并形成环形 2.后面当我们每创建一个新的节点,就把该节点,加入到己有的环形链表中即可 三.遍历环形链表 1. ...

  3. python数据结构与算法:单向循环列表

    单向循环列表:python实现,及其对应的 增删查检 操作 ##################### P4.9-P4.12 循环链表 ########################### #cod ...

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

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

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

    java模拟环形链表解决约瑟夫问题 此文是观看尚硅谷韩老师的数据结构与算法学习视频整理的笔记 约瑟夫问题描述 约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算 ...

  6. 数据结构与算法文章列表

    前言 数据结构与算法文章列表主要内容包括:稀疏数组.单向队列.环形队列.单向链表.双向链表.环形链表.约瑟夫问题.栈.前缀.中缀.后缀表达式.中缀表达式转换为后缀表达式.递归.迷宫问题.八皇后问题.散 ...

  7. 丢手帕java_java基于双向环形链表解决丢手帕问题的方法示例

    本文实例讲述了java基于双向环形链表解决丢手帕问题的方法.分享给大家供大家参考,具体如下: 问题:设编号为1.2--n的几个小孩围坐一圈,约定编号为k(1= 我们现在用一个双向环形链表来解这一问题. ...

  8. python中的列表是采用链式结构实现的_Python数据结构与算法之列表(链表,linked list)简单实现...

    Python数据结构与算法之列表(链表,linked list)简单实现 Python 中的 list 并不是我们传统(计算机科学)意义上的列表,这也是其 append 操作会比 insert 操作效 ...

  9. 数据结构 (二) ----- 单向链表双向链表

    相关文章: <数据结构 (一) ----- 数据结构基本概念&基于数组实现线性表> <数据结构 (二) ----- 单向链表&双向链表> 文章目录 单链表 一. ...

最新文章

  1. 直播「拯救」互联网?
  2. SAP-ABAP SmartForms之变量显示小技巧
  3. 一个按键控制数码管的开和关_三菱PLC数码管显示及按键控制实验
  4. competition in a limited resource
  5. leetcode108 将有序数组转换为二叉搜索树
  6. ionic打包中的那些坑
  7. Android loader 详解
  8. linux中vim怎么编辑文件内容,Linux 使用vim命令编辑文件内容
  9. linux静态ip解析花生壳域名
  10. 《java程序设计基础》使用Reader和Writer流类
  11. TortoiseSVN安装及导入已有SVN仓库
  12. 计算机英语教案模板,优秀全英文教案模板
  13. 【黄啊码】解决微信小程序showToast不显示
  14. 相同间距下,相邻层间耦合带来影响比同层间耦合更严重
  15. Bullet physics 引擎的官方文档翻译
  16. 有什么股票自动交易软件好用?
  17. Python 爬虫实战(三) 获取百度地图搜索结果
  18. 给fiash图片加链接
  19. python中登录基金账户获取基金数据
  20. FairyGUI摇杆

热门文章

  1. 小程序、vue 新闻上下轮播
  2. SpringBoot项目利用maven自定义打包结构
  3. grep搜索子目录中包含某字符串的特定文件
  4. React开发(166):ant design form 设置值
  5. Taro+react开发(70):flex布局
  6. React(76)--react 主题开发目录
  7. 前端学习(3079):vue+element今日头条管理-数据筛选处理
  8. 前端学习(3068):vue+element今日头条管理-上午总结
  9. 原生js实现tab栏切换效果
  10. [vue] 你了解什么是高阶组件吗?可否举个例子说明下?