数据结构之约瑟夫环

本文介绍了约瑟夫环问题及其解决方案,通过单向环形链表来实现。利用链表特性,设置两个指针first和helper,分别表示当前报数节点和其前一个节点。按照规则进行报数并移除节点,直到链表只剩下一个节点,完成约瑟夫环的求解。同时提供了Node和Test类的代码示例。
摘要由CSDN通过智能技术生成

先来聊聊什么是约瑟夫环,有编号为1,2,3...n个小朋友围成一圈坐,让编号为k[1,n]的下朋友开始从1报数,数到m的那个小朋友出圈,下一个小朋友接着从1开始报数,数到m的小朋友继续出圈,循环执行此操作,直至圈中所有小朋友都出圈,由此得到的出圈编号。

这里我用单向环形链表来实现约瑟夫环,在添加每个节点时,让新加入的节点的next域指向第一个节点first。下图是一个单向环形链表。

由于单链表不能实现自我删除,所以我们需要一个helper指针指向待删除节点的前一个节点。假设从第一个节点开始,first指向这个节点,helper则指向最后一个节点(若从第k个节点开始,first和helper移动k-1次);开始数时,first和helper移动m-1次,移动后的first指向要出圈的节点,此时让first = first.next,  helper.next = first,即可完成一次出圈;循环执行加粗部分,直至first == helper,此时圈中只剩下一个节点,将其出圈即可。下面是一个简单的圈图和代码实现。

Node.java


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值