题目:
编号为1~N的N个人按顺时针方向围坐一圈,每个人持有一个密码(正整数,可以自由输入),开始人选一个正整数做为报数上限值M,从第一个人按顺时针方向自1开始顺序报数,报到M时 停止报数。报M的人出列,将他的密码作为新的M值,从他顺时针方向上的下一个人开始从1报数,如此下去,直到所有人出列为止。
题目分析:
首先是约瑟夫环的大小是变化的,因此相应的结点也是变化的,我们使用链式存储结构可以动态的生成其中的结点,删除操作也非常简单。用单向循环链表对其进行出列顺序比较合适。
解题步骤:
首先需要输入参与的人数;
输入第一个密码;
把第一个人定为头结点。
代码(java实现):
package DS02.动态链表;
import DS01.动态数组.ArrayList;
/*
* 编号为1~N的N个人按顺时针方向围坐一圈,每个人持有一个密码(正整数,可以自由输入),
* 开始人选一个正整数做为报数上限值M,从第一个人按顺时针方向自1开始顺序报数,报到M时
* 停止报数。报M的人出列,将他的密码作为新的M值,从他顺时针方向上的下一个人开始从1
* 报数,如此下去,直到所有人出列为止。
* */
public class JosephusLoopUpper {
private Node head;//头结点
private Node rear;//尾节点
private int size;//数组大小
private int M;//传入的第一个密码
public JosephusLoopUpper(ArrayList<Integer> list,int M){
head=new Node(list.get(0