A约瑟夫环问题:
据说著名犹太历史学家Josephus有过一下的故事:
在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲在一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3个人该人必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。
然而Josephus和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在了第16个与第31个位置,于是逃过了这场死亡游戏。
```java
jin小编分析如下:
import DS01.动态数组.ArrayList;
import DS01.动态数组.List;
//约瑟夫环问题
public class JosephusLoop {
private Node head; //头结点
private Node rear; //尾结点
private int size; //总数
public JosephusLoop(int count){
head=new Node(1,null); //第一个结点,位置为1,next为空
rear=head;
rear.next=head;
for (int i = 2; i <=count ; i++) {
//共count个结点
/*
Node n=new Node();
n.position=i;
n.next=rear.next;
rear.next=n;
rear=rear.next;
*/
rear.next=new Node(i,rear.next);
rear=rear.next;
}
size=count;
}
public List<Integer> getSurvivePosition(){
ArrayList<Integer> list=new ArrayList<>(); //用列表获取剩余人数的位置
Node p=head;
while(size>2){
p=p.next;
Node del=p.next;
if(del==head){
//若删掉的是头结点,将头结点指向下一个存在的结点
head=head.next;
}else if(del==rear){
//若删掉的是尾结点,将头结点指向前一个存在的结点
rear=p;
}
p.next=p.next.next