约瑟夫环问题(C语言,单循环链表实现)

本文详细介绍了如何使用C语言通过单循环链表解决约瑟夫环问题,涵盖链表创建、遍历及节点删除等关键步骤,适合初学者深入理解链表操作。
摘要由CSDN通过智能技术生成
约瑟夫环问题:

   n 个人的编号是 1~n,如果他们依编号按顺时针排成一个圆圈,从编号是1的人开始顺时针报数。

(报数是从1报起)当报到 k 的时候,这个人就退出游戏圈。下一个人重新从1开始报数。
  求最后剩下的人的编号。这就是著名的约瑟夫环问题。

       解决约瑟夫环问题首先要考虑如何表示n个人围成一圈。n个人围成一圈意味着1号后面是2号,2号后面是3号,..............,n-1后面是n号。这正好用一个单循环链表表示,而且该单循环链表不需要表头。

       当输入n=5,k=3的时候

       删除2  0   4  1

       最后剩下的是:   3 

       解决约瑟夫环的问题分成两个阶段:首先根据n创建一个单循环链表,然后模拟报数过程,逐个删除结点,直到只剩下一个结点为止。创建一个循环链表和创建一个单链表基本类似,只有两个小区别:

        一是约瑟夫环不需要头节点,有了头节点反而会增加报数阶段的复杂性;

        二是最后一个结点的next指针不在为NULL,而是指向第一个结点。

        报数阶段本质上是结点的删除,报到3的结点从环上删除。报数的过程就是指针移动的过程,让指针停留在被删除结点的前一结点。

 

                                                                

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值