当前位置: 首页 > news >正文

数据结构与算法之Josephu(约瑟夫环问题)

单向环形链表应用场景
Josephu(约瑟夫环问题)

约瑟夫环问题

  • 提示:用一个不带头结点的循环链表来处理Josephu问题:先构建一个有n个结点的单循环链表。然后由k结点起从1开始计数。记到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束
    • 约瑟夫环问题-创建环形链表的思路图解
      约瑟夫环
    • 约瑟夫环问题-小孩出圈的思路分析图
      约瑟夫环
  • 代码实现
public class Josephu {public static void main(String[] args) {// 测试一把看看构建环形链表,和遍历是否okCircleSingleList circleSingleList = new CircleSingleList();circleSingleList.addBoy(5);circleSingleList.display();circleSingleList.countBoy(1,2);}}
class CircleSingleList {private Boy first;/*** 构建一个循环单向链表* @param n*/public void addBoy(int n) {if(n <= 0) {System.out.println("您输入的数字不合法");return;}Boy cur = null;for(int i = 1; i <= n;i++) {Boy boy = new Boy(i);if(first == null) {first = boy;cur = first;boy.setNext(boy);}else {boy.setNext(first);cur.setNext(boy);cur = boy;}}}/*** 显示链表*/public void display() {if(first == null) {System.out.println("没有任何小孩");return;}Boy cur = first;do {System.out.printf("编号为%d的小孩\n",cur.getNo());cur = cur.getNext();}while(cur != first);}/*** 获取循环链表个数* @return*/public int size() {Boy cur = first;int count = 0;if(cur == null) {return 0;}do{count++;cur = cur.getNext();}while(cur != first);return count;}/*** 形成一个出队序列* @param k* @param m*/public void countBoy(int k,int m) {int size = size();if(size == 0 || k <= 0 || k > size) {System.out.println("参数有误");return;}// 找到最后一个结点Boy pre = first;Boy cur = first;while(pre.getNext() != first) {pre = pre.getNext();}// 先找到第k个结点for(int i = 1; i < k;i++) {cur = cur.getNext();pre = pre.getNext();}// 移动m-1while(pre != cur) {for(int i = 1; i < m;i++) {cur = cur.getNext();pre = pre.getNext();}System.out.printf("编号为%d的小孩出队\n",cur.getNo());// 删除第m个结点cur = cur.getNext();pre.setNext(cur);}System.out.printf("编号为%d的小孩出队\n",cur.getNo());}
}
class Boy {private int no;private Boy next;public Boy() {}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;}
}

相关文章:

  • 预处理深入详解:预定义符号、宏、命名约定、命令行定义、条件编译、头文件的包含
  • JavaScript 性能优化实战研讨
  • 吴恩达MCP课程(1):chat_bot
  • 【仿生机器人】仿生机器人系统架构设计2.0——具备可执行性
  • 【仿生机器人系统设计】涉及到的伦理与安全问题
  • 京东热点缓存探测系统JDhotkey架构剖析
  • Python的Web框架
  • Linux分区与文件系统选择:EXT4与XFS深度解析
  • MCU STM32搭配存储SD NAND(贴片式T卡)于智能皮电手环(Galvanic Skin Response, GSR 手环)的全方位评测
  • SPL做量化----SRMI(动量修正指标)
  • Selenium操作指南(全)
  • 鸿蒙OSUniApp自定义手势识别与操作控制实践#三方框架 #Uniapp
  • vue3中使用swiper轮播图的slideTo方法跳转到指定页面
  • 60天python训练计划----day40
  • Excel 中的SUMIFS用法(基础版),重复项求和
  • EasyExcel复杂Excel导出
  • VSCode无法转到定义python源码(ctrl加单击不跳转)
  • wireshark分析国标rtp ps流
  • 【Office】Excel两列数据比较方法总结
  • 用wireshark抓了个TCP通讯的包
  • 淄博网站制作哪家好/个人网页怎么制作
  • h5设计是什么/杭州百家号优化
  • 建站公司怎么备案/市场监督管理局上班时间
  • 西安印象网站建设/新闻头条今日新闻60条
  • 国外画册设计欣赏网站/360搜索推广
  • 中国外发加工网真实吗/关键词排名优化是什么意思