java===java习题---Josephu问题

package testbotoo;
/**
 * 
 * @author 
 */

public class Demo4 {
    public static void main(String[] args)
    {
        CycLink cyclink = new CycLink();
        cyclink.setLen(10);
        cyclink.createLink();
        cyclink.setK(2);
        cyclink.setM(2);
        cyclink.show();
        cyclink.play();
    }

}


class Child
{
    int num;
    Child nextChild = null;
    
    public Child(int num){
        this.num = num;
    }
}


class CycLink
{
    //先定义一个指向链表第一个小孩的应用
    Child firstChild = null;
    
    Child temp = null;
    int len = 0; //表示共有几个小孩
    int k = 0;
    int m = 0;
    
    //设置从第几个人开始数数
    public void setK(int k)
    {
        this.k = k;
    }
    
    public void setM(int m)
    {
        this.m = m;
    }
    
    public void setLen(int len)
    {
        this.len = len;
    }

    //开始play
    public void play()
    {
        Child temp = this.firstChild;
        //1.先找到开始数数的人
        for(int i = 1; i<k;i++)
        {
            temp = temp.nextChild;
        }
        while(this.len!=1)
        {
            //2.数m下
            for(int j=1;j<m;j++ )
            {
                if(j<m-1)
                {
                    temp = temp.nextChild;
                }else
                {    //数到最后一下,打印要出圈的孩子的num
                    temp = temp.nextChild;
                    System.out.println("要出圈的小孩是"+temp.num);
                }
            }
            //找到要出圈的前一个小孩
            Child temp2 = temp;
            while(temp2.nextChild!=temp)
            {
                temp2 = temp2.nextChild;
                
            }
            
            //3.将数到m的小孩推出圈
            temp2.nextChild = temp.nextChild;
            temp=temp.nextChild;
            this.len--;
        }
        //最后一个小孩
        System.out.println("最后剩下的小孩是:"+temp.num);
    }
    
    //初始化环形链表
    public void createLink()
    {
        for(int i = 1; i <= len; i++)
        {
            if (i==1)
            {
                //创建第一个小孩
                Child ch = new Child(i);
                this.firstChild = ch;
                this.temp =ch;
            }else  if(i == len)
            {
                //创建最后一个小孩
                Child ch = new Child(i);
                temp.nextChild = ch;
                temp =ch;
                temp.nextChild = this.firstChild;
            }else
            {
                Child ch = new Child(i);
                temp.nextChild = ch;
                temp = ch;
                
            }
        }
    }
    
    public void show()
    {
        //定义一个跑龙套的
        Child temp = this.firstChild;
        do{
            System.out.println(temp.num);
            temp = temp.nextChild;
        }while(temp!=this.firstChild);
    }
}
原文地址:https://www.cnblogs.com/botoo/p/8796529.html