每天一道算法题の约瑟夫问题详解

文章介绍了如何用单向环形链表来解决约瑟夫问题,即N个人围成一圈,从第k个人开始报数,数到m的人出圈,直到所有人都出圈。通过初始化链表,设置first和curBoy变量跟踪节点,以及helper指针处理出圈过程,实现了算法的逻辑。
摘要由CSDN通过智能技术生成

约瑟夫问题

:有 N 个人围成一圈,每个人都有一个编号,编号由入圈的顺序决定,第一个入圈的人编号为 1,最后一个为 N,从第 k (1<=k<=N)个人开始报数,数到 m (1<=m<=N)的人将出圈,然后下一个人继续从 1 开始报数,直至所有人全部出圈,求依次出圈的编号。

查看源码

基于单向环形链表实现:

  1. 初始化一个单向环形链表:

    • 使用变量

      • first:指向第一个元素,起始的first应该为null,当链表添加第一个节点时,first应该指向该节点,且first的next指向自己
      • curBoy:指向当前的节点(也是当前链表的最后一个节点),因为first作为第一个节点不能随意改动,所以curBoy作为first的辅助变量
    • 实现思路:

      ​ 循环创建Boy节点,当创建第一个Boy节点时,将first指向它,且first的next指向自己,同时记录当前链表的最后一个节点curBoy;从第二个节点开始,每次添加节点在curBoy后,并将其next指向first,然后记录curBoy

  2. 计算出圈顺序:

    • 使用变量

      • helper:指向first的前一个节点
      • first:表示当前开始数数的起始节点
    • 实现思路:

      ​ 首先要将helper指向first的前一个节点,也就是链表的最后一个节点;接着要将first移动到启动点startNo,helper要随之移到到其前一个节点;然后first和helper循环移动m-1次,移动后的first指向的就是需要出圈的节点,执行first = first.next helper.next = first即可将其出圈,直到链表中只剩下一个节点时,结束游戏。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值