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

作者: C语言基础 | 来源:发表于2019-03-14 15:51 被阅读16次

    循环链表

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

    和它名字的表意一样,只需要将表中最后一个节点的指针指向头结点,链表就能成环儿,如图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.haomeiwen.com/subject/ldccmqtx.html