您的位置:首页 > 编程语言 > Java开发

约瑟夫问题

2016-11-30 11:39 399 查看
import java.util.*;
/*
单向链表
*/
class Child{
public int num;//编号
public Child nextChild;//下一个小孩

public Child(int num){
this.num = num;

}
}
/**
约瑟夫问题,用单向链表(思考:用双向链表)
*/
class Main{
public static void main(String[] args){
List<Child> list = new ArrayList<Child>();
//创建50个小孩,加入到集合中
for(int i = 0;i<50;i++){
Child c = new Child(i);
list.add(c);
}

//将小孩连起来
for(int i = 0;i<50;i++){
if(i<49){
Child c = list.get(i);
c.nextChild = list.get(i+1);
}else{
list.get(i).nextChild = list.get(0);
}

}
/*
for(int i = 0;i<50;i++){
System.out.print(list.get(i).num+"\t");
System.out.println(list.get(i).nextChild.num);
}
*/
Child temp = list.get(0);//指针,初始值为指向第0个小孩
int n = 5;//数到5,该小孩退出,
int k = 2;//从编号为2的小孩开始报数
while(temp.nextChild !=temp){

//1、先找到开始数数的人
for(int i=0;i<k;i++){
temp = temp.nextChild;
}
//2、数n下,指针temp刚好指向数第n下的这个小孩
for(int j = 1;j<n;j++){
temp = temp.nextChild;
}
//找到要出圈的小孩的前一个小孩(因为是单向链表,所以只能找一个循环才能找到)
Child temp2 = temp;//要出圈的小孩
while(temp2.nextChild !=temp){
temp2 = temp2.nextChild;
}
//3、移除该小孩
//让要出圈的前一个小孩的nextChild指向要出圈的小孩的下一个小孩
temp2.nextChild = temp.nextChild;
}

System.out.println(temp.num);//最终小孩的编号

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 问题 约瑟夫