文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java编程内功-数据结构与算法「环形链表与约瑟夫问题」

2024-12-03 10:02

关注

循环链表处理Josephu问题

先构成一个有n个节点的单向循环链表,然后由k节点器从1开始计数,计到m时,对应节点从链表删除,然后再从被删除节点的下一个节点又从1开始计数,直到最后一个节点从链表中删除.

构建一个单向环形链表

先创建第一个节点,让first指向该节点,并形成环.

后面每创建一个新的节点,就把该节点,加入环形链表即可.

代码案例

  1. package com.structures.linkedlist; 
  2.  
  3. public class Josephu { 
  4.     public static void main(String[] args) { 
  5.         CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList(); 
  6.         circleSingleLinkedList.addBoy(5); 
  7.         circleSingleLinkedList.showBoys(); 
  8.         circleSingleLinkedList.countBoy(1,2,5); 
  9.  
  10.          
  11.     } 
  12.  
  13. //创建一个环形的单向链表 
  14. class CircleSingleLinkedList { 
  15.     //创建一个first节点,当前没有编号 
  16.     private Boy first = new Boy(-1); 
  17.  
  18.     //添加小孩节点,构建成一个环形链表 
  19.     public void addBoy(int nums) { 
  20.         if (nums < 1) { 
  21.             System.out.println("nums 值不正确"); 
  22.             return
  23.         } 
  24.         Boy curBoy = null
  25.         //for循环创建环形链表 
  26.         for (int i = 1; i <= nums; i++) { 
  27.             Boy boy = new Boy(i); 
  28.             //如果是第一个小孩 
  29.             if (i == 1) { 
  30.                 first = boy; 
  31.                 first.setNext(first); 
  32.                 curBoy = first;//让curBoy指向第一个 
  33.             } else { 
  34.                 curBoy.setNext(boy); 
  35.                 boy.setNext(first); 
  36.                 curBoy = boy; 
  37.             } 
  38.         } 
  39.     } 
  40.  
  41.     //遍历当前环形链表 
  42.     public void showBoys() { 
  43.         if (first.getNext() == null) { 
  44.             System.out.println("没有任何小孩~~"); 
  45.             return
  46.         } 
  47.         Boy temp = first
  48.         while (true) { 
  49.             System.out.println("小孩的编号:" + temp.getNo()); 
  50.             if (temp.getNext() == first) { 
  51.                 break; 
  52.             } 
  53.             temp = temp.getNext(); 
  54.         } 
  55.     } 
  56.  
  57.      
  58.     public void countBoy(int startNo, int countNum, int nums) { 
  59.         //先进行数据校验 
  60.         if (first == null || startNo < 1 || startNo > nums) { 
  61.             System.out.println("参数输入有误,请重新输入"); 
  62.             return
  63.         } 
  64.         //创建一个辅助指针,帮助完成小孩出圈 
  65.         Boy helper = first
  66.         //让helper指向环形链表的最后节点 
  67.         while (helper.getNext() != first) { 
  68.             helper = helper.getNext(); 
  69.         } 
  70.         //报数前,先让helper和first移动,移动k-1次,这样first定位到开始节点,helper紧接着first 
  71.         for (int i = 0; i < startNo - 1; i++) { 
  72.             first = first.getNext(); 
  73.             helper = helper.getNext(); 
  74.         } 
  75.         //报数时,让first和helper指针同时移动,然后出圈 
  76.         while (true) { 
  77.             //当圈中只有一个节点 
  78.             if (helper == first) { 
  79.                 break; 
  80.             } 
  81.             //让first和helper指针同时移动countNum - 1次 
  82.             for (int i = 0; i < countNum - 1; i++) { 
  83.                 first = first.getNext(); 
  84.                 helper = helper.getNext(); 
  85.             } 
  86.             //此时first节点就是小孩要出圈的节点 
  87.             System.out.printf("小孩%d出圈\n"first.getNo()); 
  88.             first = first.getNext(); 
  89.             helper.setNext(first); 
  90.         } 
  91.         System.out.printf("最后留在圈中的小孩编号%d \n"first.getNo()); 
  92.     } 
  93.  
  94. //创建一个Boy类,表示节点 
  95. class Boy { 
  96.     private int no;//编号 
  97.     private Boy next;//指向下一个节点,默认null 
  98.  
  99.     public Boy(int no) { 
  100.         this.no = no
  101.     } 
  102.  
  103.     public int getNo() { 
  104.         return no
  105.     } 
  106.  
  107.     public void setNo(int no) { 
  108.         this.no = no
  109.     } 
  110.  
  111.     public Boy getNext() { 
  112.         return next
  113.     } 
  114.  
  115.     public void setNext(Boy next) { 
  116.         this.next = next
  117.     } 

 【编辑推荐】

  1. 凉凉,老板叫我开发一个简单的工作流引擎...
  2. Windows10将迎来翻天覆地变化!今年第一个更新来了
  3. 2021年将迎来六大网络安全趋势
  4. Windows 10近年最大改进!Windows10 21H2新特性抢先看
  5. 小爱同学竟然推出了PC版?带你体验电脑版小爱

 

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯