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

约瑟夫问题对应算法的实现(思路分析) [Java][数据结构]

约瑟夫问题对应算法的实现(思路分析)

我们前面已经创建好了单向环形链表类了,这个时候我们要通过这个单向环形链表类来解决约瑟夫问题:

约瑟夫问题算法的具体实现的思路分析:

  1. 需求创建一个辅助指针(变量)helper,事先应该指向环形链表的最后这个节点

  2. 加上我们在单向链表中封装的first指针,我们就可以完成节点出链表的操作,首先我们要确定从第几个节点开始报数,假设是从第k个开始报数,那么我们就让first和helper指针同时移动k - 1次

上面的first就是指向第一个报数的小孩节点,而上面的helper指向的就是报数的小孩的前一个位置,这个时候如果first指针指向的小孩节点要进行一个出链表,这个时候就是先让first后移,然后让helper指向后移之后first指向的结点位置,

  1. 当小孩开始报数时,让first和helper指针同时移动m - 1次(m就是报数到多少就出队列的数字) , 这里应该为从自己开始报数 ,所以报2的时候就是移动第一次,那么报m时也就是移动m - 1次, 然后移动完成之后我们的first就指向了待出链表的小孩

  2. 那么让first指向的小孩节点出圈: (执行下面操作即可)

    first = first.next; //让first指针指向下一个位置,那么此时的first指向的结点就会被跳过
    helper.next = first; //让helper.next目前还是指向原来的first,所以我们要使用helper.next指向现在                      //的first
    //此时原来first指针指向的结点就没有任何的引用指向它,就会等待被垃圾回收
    

补充:

为什么我们可以使用helper指针指向first结点的前一个节点?

  • 因为我们的first指针是指向我们的待删除结点,但是这时候我们是一个单向链表,在单向链表中我们不能完成自我删除(在双向链表中可以完成自我删除) , 我们在单向链表中要通过带删除结点的前一个结点来删除带删除结点

当我们的first指针指向我们的待删除结点之后,让我们的first结点移动m - 1次,一直重复执行,每次移动m - 1次之后first就指向了待删除结点,那么我们删除了该待删除结点之后first自然就会后移,就会指向我们删除位置的下一个节点,也就是开始报数的小孩,那么我们只需要再遍历m - 1次就可以又找到下一次的待删除位置了然后一直重复执行,直到执行到我们的单向环形链表中只有一个节点为止

  • 当环形链表中只有一个节点的时候我们就要退出了,因为当链表中只有一个节点的时候 这个时候first和helper指向了同一个节点,这个时候都指向了自己,通过上面的通用操作就删除不了这个最后一个节点了
    • 当只剩最后一个节点的时候我们就退出循环,单独执行这个最后一个节点的删除,直接让frist指向null就可以了(我们可以让helper也指向null , 那么最后这个结点也就等待被回收了)

补充二:

当我们使用private修饰next属性之后,这时候我们不能使用 first.getNext() = helper,不能这样执行,因为first.getNext()其实就是获取到了一个值,他并不是一个变量,我们获取的值只能是赋给某个变量(这个是一个语法错误, 我们的工具会报错的, 我们只能是helper = first.getNext(), 而不是first.getNext() = helper) , 我们如果想要修改first的next属性就要通过first.setNext(helper)来完成

  • 总之就是值只能是赋给变量,不能将值赋给值 , 值赋给值就相当于 1 = 2, 这个肯定是错误的

相关文章:

  • 深圳市第十二届职工技术创新运动会暨2022年深圳技能大赛—集成电路应用开发职业技能竞赛
  • 携职教育:对于想进入财务工作的人来说,第一个证考CPA还是CMA?
  • PostgreSQL 创建数据库、创建用户、赋予权限、创建表、主键总结
  • SynchroTrap:基于相似度的异常检测算法
  • 【微信小程序模板直接套用】微信小程序制作模板套用平台
  • 彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-用户系统EP03
  • 适合开发者使用的6款浏览器,开发者工具很实用
  • 中国智能网联汽车信息安全分析2022案例征集
  • UEditorPlus v2.4.0发布 Word图片粘贴重构,功能样式优化
  • 2366. 将数组排序的最少替换次数
  • 牛客 NC26257 小雨坐地铁
  • 基于springboot+vue+elementui的游戏攻略分享平台
  • 【设计模式】Java设计模式 - 模板模式
  • 【C++之数组与指针2】利用指针对数组求和
  • NOIP 2013 普及组初赛试题
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • JavaScript函数式编程(一)
  • Java程序员幽默爆笑锦集
  • jquery cookie
  • Linux后台研发超实用命令总结
  • vue-loader 源码解析系列之 selector
  • 阿里云应用高可用服务公测发布
  • 翻译--Thinking in React
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 你不可错过的前端面试题(一)
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 新版博客前端前瞻
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #{}和${}的区别?
  • (8)STL算法之替换
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (二)JAVA使用POI操作excel
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)springboot教学评价 毕业设计 641310
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (转)shell调试方法
  • (转)Sublime Text3配置Lua运行环境
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .net Application的目录
  • .Net MVC + EF搭建学生管理系统
  • .net Signalr 使用笔记
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .net6Api后台+uniapp导出Excel
  • .NET开源项目介绍及资源推荐:数据持久层