有10个同学手拉手围成一圈,从第一个同学开始计数。每数到3去掉一个同学,剩余同学继续围成一圈,从下一个同学开始重新计数。依此类推,直到剩下最后一个同学为止。编程确定最后一个同学的编号。要求输出结果如下图。

解决方案 »

  1.   

    这不是约瑟夫环吗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;
    }
    }很久之前写的一个算法,只是单纯的实现了,没考虑最优化问题
      

  2.   

    循环链表 一下就就解决了。LinkList
      

  3.   

    http://topic.csdn.net/u/20120627/20/4f300b35-b616-4d3d-8a22-e5313f9fc3cb.html