约瑟夫问题也就是我们常见的丢手帕。
约瑟夫问题:
设编号为 1,2,...n 的 n 个人围坐一圈,约定编号为 k(1<=k<=n) 的人
从 1 开始报数, 数到 m的那个人出列, 它的下一位又从 1 开始报数, 数到 m的那个人又出列,
依次类推,直到所有人出列为止,由此产生一个出队编号的序列。
提示: 用一个不带头结点的循环链表来处理 Josephu 问题: 先构成一个有 n 个结点的单
循环链表, 然后由 k 结点起从 1 开始计数,计到 m时,对应结点的人从链表中删除,然后再
从被删除结点的下一个结点又从 1 开始计数,直到最后一个结点从链表中删除算法结束。
这里我们要注意一点:
在C/C++中我们都可以使用指针,所以我们在建立一个链表的时候我们可以使用指针直接指向下一个节点即可。
p = p->next;
双向链表删除节点的时候很方便: p->pre = p->next;即可。这里只是粗略描述一下。
但是在Java中没有指针可用,我们只能用第二种方法。就是游标来标记链表。
由于代码注释比较详细。我们只分析一下思路。
丢手帕问题就是一群孩子做成一个圈,然后找一个人(节点)开始数,数到谁谁就退出游戏。
那么我们code的任务就是:
1、先做出来每个节点的属性,然后新建一个环形的链表(孩子围成的圈)。
2、找到开始的那个人,然后开始数数。数到谁,用从链表中删除该节点。
3、循环查找,直到最后剩下的那个节点。然后