约瑟夫问题
1)设编号为 1,2,3 ... n 的 n 个人围坐一圈。
2)约定编号为 k (1 <= k <= n)的人从 1 开始报数,数到 m 的那个人出列。
3)它的下一位又从 1 开始报数,数到 m 的那个人又出列,依此类推,直到所有人出列为止。
4)由此产生一个出列编号的序列。
解题思路
1)构建一个结构体 Boy
No 为 Boy 的编号。
Next 指针指向下一个 Boy。
代码如下:
// 小孩的结构体
type Boy struct {
No int // 编号
Next *Boy // 指向下一个小孩的指针
}
2)根据编号,创建一个单向环形队列。
假设 n = 5 ,即一共圈内有5个小孩,创建完成的结构体如图所示:
first 指针指向队首。
curBoy 指针指向当前要添加的新节点。
当只有一个小孩时,构成一个自循环,Next 指针指向自身,如图所示:
当不止一个小孩,新节点加入的流程如图所示:
1、构建编号为 n 的新节点 boy
boy := &Boy{
No: i,
}
2、循环加入编号为 n 的新节点:
让 curBoy 的 Next 指针指向新建立的节点 boy
让 curBoy 指针指向新建立的节点 boy
让 curBoy 的 Next 指针指向头节点 first
依此类推,循环加入新节点
如图所示: