62,621
社区成员
发帖
与我相关
我的任务
分享
import java.util.*;
public class JOSEPH_PROBLEM{
/**
*递归法
*@param loop 每次数数循环的最大值,数到此数的元素需要退出出链表
*@param size 链表的大小,即有几个人
*@param list 每次数数时的新链表
*@param begin 每次数数开始的位置节点
*/
public static void resolve(List<Node> list,int size, int loop,Node begin){
Node temp = begin;
if(size > 1){
for(int i = 0; i < loop; i++){
begin = begin.getNext();
}
for(int i = 0; i < loop - 2; i++){
temp = temp.getNext();
}
System.out.println(temp.getNext());
list.remove(temp.getNext());
temp.setNext(begin);
resolve(list,list.size(),loop,begin);
}else{
System.out.println(list.get(0));
}
}
//测试main方法!!
public static void main(String[] args){
int count = 0;
int loop = 0;
System.out.println("请输入人数:");
Scanner input = new Scanner(System.in);
count = input.nextInt();
System.out.println("请输入循环数:");
loop = input.nextInt();
List<Node> list = Node.generator(count);
Node begin = list.get(0);
JOSEPH_PROBLEM.resolve(list, count, loop, begin);
}
}
class Node{
private Node next;
private static int data = 1;
private final int COUNT = data++;
public Node getNext(){
return next;
}
public void setNext(Node next){
this.next = next;
}
public String toString(){
return COUNT+"";//+" :"+next;
}
public static List<Node> generator(int count){
List<Node> list = new LinkedList<Node>();
Node node = new Node();
list.add(node);
for(int i = 0; i < count-1; i++){
Node next = new Node();
list.add(next);
list.get(i).setNext(next);
}
list.get(count-1).setNext(node);
return list;
}
}