题目
约瑟夫环问题,这是一个很经典算法,处理的关键是:伪链表
问题描述:N个人围成一圈,从第一个人开始报数,报到m的人出圈,剩下的人继续从1开始报数,报到m的人出圈;如此往复,直到所有人出圈。(模拟此过程,输出出圈的人的序号)
解法
这里采用封装的上层数据结构“队列”来解这个问题,实际底层我们选用链表的实现(LinkedList),这与书本上的数组解法,链表解法大同小异,换汤不换药而已,只是代码比较简洁。
题解
public static void ysfByQueue(int personNumber,int number){
Queue<Integer> queue=new LinkedList();
//人员入队
for(int i=1;i<=personNumber;i++){
queue.add(i);
}
int count=0;//计数
//算法
while(!queue.isEmpty()){
int person=queue.poll();
count++;
if(count%number==0){
//数到到了,此人直接出队
System.out.println(person);
count=0;
}else{
//重新入队
queue.add(person);
}
}
}
```