约瑟夫问题(Josephus)java链表解决

来源:互联网 发布:plsql 执行sql文件 编辑:程序博客网 时间:2024/06/11 02:42

/*设编号为12、、、、nN个人围成一圈,约定编号为K1<K<n)的人开始从1开始报数,数到M的那个人出列,她的下一位从1开始报数,数到M的那个人出列,以此类推,直到所有人出列算出最后一个出列的?*/

以下是源码:

 

package com.ym;//包自己引这是我的

public class demo3 {

 

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

Cyclink Cyclink=new Cyclink();

Cyclink.Setlen(4);

Cyclink.createLink();

Cyclink.setM(2);

Cyclink.setk(2);

Cyclink.show();

Cyclink.play();

}

 

}

//创建小人小孩只有编号

class Child{

int no;

Child nextChild=null;

public Child(int no){

//给一个编号

this.no=no;

}

}

//首先创建环形链表

class Cyclink{

public static int setk;

//先定义一个指向第一个孩子的引用

//指向第一个小还得引用不能用fristChild

Child fristChild=null;

//定义游标负责链接

Child temp=null;

int len=0;//表示共有多少小孩初始化为0

int k=0;

int m=0;

public void setM(int m){

this.m=m;

}

//从第几个人开始数数

public void setk(int k){

this.k=k;

}

//设置环形链表的大小

public void Setlen(int len){

this.len=len;

}

//开始paly

public void play(){

Child temp=this.fristChild;

//开始找到数数的人

for(int i=1;i<k;i++){

temp=temp.nextChild;

}

while(this.len!=1){

//熟M下

for(int j=1;j<m;j++){

temp=temp.nextChild;

}

Child temp2=temp;

//找到要出圈的小孩

while(temp2.nextChild!=temp){

temp2=temp2.nextChild;

}

//将数到M的小孩踢出去

temp2.nextChild=temp.nextChild;

temp=temp.nextChild;

this.len--;

}

System.out.print("最后剩下"+temp.no);

}

//初始化环形链表设定环形链表的大小

public void createLink(){

for(int i=1;i<=len;i++){

//创建第一个小孩

if(i==1){

Child ch=new Child(i);

this.fristChild=ch;

this.temp=ch;

}else{

if(i==len){

Child ch=new Child(i);

temp.nextChild=ch;

temp=ch;

temp.nextChild=this.fristChild;

}else{

Child ch=new Child(i);

temp.nextChild=ch;

temp=ch;

}

}

}

}

//下面是验证输出地是否有效

public void show(){

Child temp=this.fristChild;

do{

System.out.print(temp.no);

temp=temp.nextChild;

}while(temp!=this.fristChild);

}

}

原创粉丝点击