单向环形链表应用场景
-
约瑟夫问题(约瑟夫环)
- 设编号为1,2…,n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。
- 采用一个单项环形链表来处理(可以带表头也可以不带表头),具体使用头结点还是不带头结点,后面会具体分析。
-
单项环形链表介绍
-
约瑟问题示意图
-
n=5,即有5个人
-
k=1,从第一个人开始报数
-
m=2,数2下
-
出队列顺序2,4,1,5,3
-
-
将解决约瑟夫问题分为两个步骤
-
第一步:做环形链表
-
思路
-
示意图
-
描述
- 创建
- 先创建第一个节点,让first指向该节点,并形成环形。
- 后面当我们每创建一个新节点,就把该节点,加入到已有的环形链表中即可。
- 遍历
- 先让一个辅助指针curBoy,指向first节点
- 然后通过一个while循环遍历该环形链表即可,遍历结束标志curBoy.next ==first。
- 创建
-
代码编写
-
-
-
第二步:解决约瑟夫问题
-
思路
-
示意图
-
描述
-
需求创建一个辅助指针(变量)helper,实现应该指向环形链表的最后这个节点。
-
小孩报数前,先让first和hepler移动k-1次
-
当小孩报数时,让first和helper指针同时移动m-1次
-
这时就可以将first指向的小孩节点出圈
first =first.next; helper.next = first;
原来first指向的节点就没有任何引用,就会被回收
-
代码
-
-
-
-