Josephus问题解答
public class Josephus {
private mylist first;//头指针
private mylist cur;//尾指针,构建环形链表
private int people;//围圈人数
private mylist helper;//辅助指针,用于出圈
Josephus(int people,int m){//从1报数到m,数到m的人出圈
this.people = people;
first = new mylist(1);
first.next = first;
cur = first;
for(int i = 1;i<people;i++)
add(i+1);
getHelper();
delete(m);
}
public void getHelper(){
//用于获取辅助指针,刚开始指向first的前一个
helper = first.next;
while(helper.next!=first)
{
helper = helper.next;
}
System.out.println(helper.val);
}
public void delete(int m){
//出圈函数
while(helper!=first )
{
int i = 0;
while(i<m-1)
{
first = first.next;
helper = helper.next;
i++;
}
System.out.println("本次出圈为"+first.val);
first = first.next;
helper.next = first;
}
System.out.println("最后一个小朋友是"+first.val);
}
public void add(int val){
//构建环形链表
mylist newman = new mylist(val);
cur.next = newman;
newman.next = first;
cur = cur.next;
}
}
class mylist{//单链表
int val;
mylist next;
mylist(){
next = null;
}
mylist(int val,mylist next){
this.next = next;
this.val = val;
}
mylist(int val){
this.val = val;
}
}
应该还挺通俗易懂的