约瑟夫环: 一个杀人游戏算法

循环链表

《约瑟夫环: 一个杀人游戏算法》

把链表的两头连接,使其成为了一个环状链表,通常称为循环链表。

和它名字的表意一样,只需要将表中最后一个节点的指针指向头结点,链表就能成环儿,如图1 所示。

《约瑟夫环: 一个杀人游戏算法》 图1 循环链表

需要注意的是,虽然循环链表成环状,但本质上还是链表,因此在循环链表中,依然能够找到头指针和首元节点等。循环链表和普通链表相比,唯一的不同就是循环链表首尾相连,其他都完全一样。

循环链表实现约瑟夫环

《约瑟夫环: 一个杀人游戏算法》 行文不易,新手上路,多多关注,这真的对我很重要,私信更有惊喜

约瑟夫环问题,是一个经典的循环链表问题,题意是:已知 n 个人(分别用编号 1,2,3,…,n 表示)围坐在一张圆桌周围,从编号为 k 的人开始顺时针报数,数到 m 的那个人出列;他的下一个人又从 1 开始,还是顺时针开始报数,数到 m 的那个人又出列;依次重复下去,直到圆桌上剩余一个人。

如图 2 所示,假设此时圆周周围有 5 个人,要求从编号为 3 的人开始顺时针数数,数到 2 的那个人出列:

《约瑟夫环: 一个杀人游戏算法》 图 2 循环链表实现约瑟夫环

出列顺序依次为:

编号为 3 的人开始数 1,然后 4 数 2,所以 4 先出列;

4 出列后,从 5 开始数 1,1 数 2,所以 1 出列;

1 出列后,从 2 开始数 1,3 数 2,所以 3 出列;

3 出列后,从 5 开始数 1,2 数 2,所以 2 出列;

最后只剩下 5 自己,所以 5 胜出。

约瑟夫环问题有多种变形,比如顺时针转改为逆时针等,虽然问题的细节有多种变数,但解决问题的中心思想是一样的,即使用循环链表。

通过以上的分析,我们可以尝试编写 C 语言代码,完整代码如下所示:

打开UC浏览器 查看更多精彩图片

《约瑟夫环: 一个杀人游戏算法》
《约瑟夫环: 一个杀人游戏算法》 行文不易,新手上路,多多关注,这真的对我很重要,私信更有惊喜

    原文作者:这个人很懒什么都没留下
    原文地址: https://www.jianshu.com/p/38b54f41eaba
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞