java求解约瑟夫问题

/**
 * @作者 擎宇
 * @功能 约瑟夫问题求解
 * @时间 2018.04.25
 */


package test;


public class Test {


public static void main(String[] args) {
// TODO Auto-generated method stub
Linklist linklist = new Linklist();
linklist.setLen(5);//设置链表大小
linklist.creatLinklist();//创建链表
linklist.PrintLinklist();//打印链表
System.out.print("\n删除序列为:");
Josephus josephus = new Josephus();
josephus.setm(2);//设置开始的那个节点
josephus.setn(2);//数n下一循环
josephus.start();
}


}


class People {
int number;
People nextPerson=null;
public People(int num){
this.number=num;
}
}


class Linklist{
static int len=0;//链表大小
static People firstPeople=null;//链表头结点
People temp;
public void setLen(int len){
this.len=len;
}

//初始化链表
public void creatLinklist(){ 
for(int i=1;i<=len;i++){
if(i==1){
People person=new People(i);
this.firstPeople=person;
this.temp=person;
}
else{
if(i==len){
People person=new People(i);
temp.nextPerson=person;
person.nextPerson=this.firstPeople;
}
else{
People person=new People(i);
temp.nextPerson=person;
temp=person;
}
}
}
}

//打印链表
public void PrintLinklist(){
People temp = this.firstPeople;
System.out.print("当前序列为:");
for(int k=1;k<=len;k++){
System.out.print(temp.number+" ");
temp=temp.nextPerson;
}
}
}
class Josephus{
int m;//从第几个人开始
int n;//数n下
public void setm(int m){
this.m=m;
}
public void setn(int n){
this.n=n;
}
public void start(){
//首先要找到开始的那个人的位置
People temp = Linklist.firstPeople;
for(int i=1;i<m;i++){
temp=temp.nextPerson;
}
while(Linklist.len!=0){
//接下来要找到要删除的那个节点,因为要删除那个节点,所以应知道他的前一个节点和后一个节点
for(int j=1;j<n-1;j++){
temp=temp.nextPerson;
}
System.out.print(temp.nextPerson.number+" ");//输出要删除的节点
People temp2=(temp.nextPerson).nextPerson;//要删除的下一个节点
temp.nextPerson=temp2;//要删除的节点的前一个节点指向要删除的后一个节点
temp=temp2;
Linklist.len--;
}
}
}

猜你喜欢

转载自blog.csdn.net/qq_39996840/article/details/80083362