Josephu问题-下——实现程序功能

Josephus问题求解

    设有n个人围坐一个圆桌周围,,现从第k人开始报数,数到第m的人出列,

    然后从出列的下一个重新开始报数,数列的第m个人又出列……如此重复,直
    到所有的人全部出列为止。对任意给定的n、k、m,求按出列次序得到的n个
    人员的顺序表。

(这个问题看别人用C以数学算法与递归法写出来,代码不过几行,我这上百行的代码确实有点汗颜)

续:算法优化——在每次数到m-1下时,保存当时那个对象的.nextPeron,就不用再重新去找被删除对象的前一个对象了,这里不再修改了。

import java.util.Scanner;
class Person{
	int no;
	Person nextPerson = null;
	public Person(int no){
		this.no = no;
	}
}
class CycleLink{
	Person firstPerson = null; //指向链表第一个人的引用
	int len; //定义链表长度
	Person temp = null;
	int k = 0;	
	int m = 0;	
	
			//设定链表长度
	public void setLen(int len){
		this.len = len;
	}
			//从第几个人开始数
	public void setK(int k){
		this.k = k;
	}
			//每次数几下
	public void setM(int m){
		this.m = m;
	}
			//创建链表
	public void createLink(){
		for(int i=1; i<=len; i++){
			Person p = new Person(i);
				//环链的第一个对象
			if(i==1){
				this.firstPerson = p;	//将第一个对象的引用存放在firstPerson中
				this.temp = p;	//将第一个对象的引用暂时赋于temp,用于接收下一个对象的引用
			}
				//环链的最后一个对象
			else if(i==len){
				this.temp.nextPerson = p;	//将最后一个对象的引用赋给倒数第二个对象的nextPerson
				temp = p;		//将当前对象(也就是最后一个对象)的引用暂赋给temp
				temp.nextPerson = this.firstPerson;	//将第一个对象的引用赋给最后一个对象的nextPerson
				
			}else{
				this.temp.nextPerson = p;//将当前对象的引用赋给上一个对象的引用变量nextPerson中
				this.temp = p;	//将当前对象的引用暂时赋于temp,用于接收下一个对象的引用
			}
		}
	}
			//打印环形链表
	public void showLink(){
		Person t = firstPerson;	
		do{
			System.out.println(t.no);
			t = t.nextPerson; /*前一个对象的nextPerson存放的下一个对象的引用
							  (因为对象也是引用类型,相当于是引用的引用)*/
		}while(t!=firstPerson);
	}
	public void play(){
		Person temp = this.firstPerson;	//将第一个人这个对象的引用交给temp临时变量
			//找到开始数数的人
		for(int i=1; i


你可能感兴趣的:(Java)