约瑟夫问题
关于丢手绢问题简单通过环形链表实现
/**
* @ClassName Josepfu
* @Description TOOD
* @Author zhangbinbin
* @Date 2020/9/22 19:33
* @Vestion 1.0
* 约瑟夫问题
**/
public class Josepfu {
public static void main(String[] args) {
CircleSingleLinkedList singleLinkedList=new CircleSingleLinkedList();
singleLinkedList.addBoy(10);
singleLinkedList.showBoy();
singleLinkedList.countBoy(1,2,10);
}
}
class CircleSingleLinkedList{
private Boy first=null;
public void addBoy(int nums){
if(nums<1){
System.out.println("nums输入不正确");
return;
}
Boy curBoy=null;
for(int i=1;i<=nums;i++)
{
Boy boy=new Boy(i);
if(i==1)
{
first=boy;
first.setNext(first);
curBoy=first;
}else {
curBoy.setNext(boy);
boy.setNext(first);
curBoy=boy;
}
}
}
public void showBoy(){
if(first==null)
{
System.out.println("链表为空");
return;
}
Boy curBoy = first;
while (true)
{
System.out.print("小孩的编号:");
System.out.println(curBoy.getNo());
if(curBoy.getNext()==first){
break;
}
curBoy=curBoy.getNext();//后移
}
}
//从哪个开始,数了几下 ,有多少个小孩
public void countBoy(int startNo,int countNum,int nums)
{
if(first==null||startNo<1||startNo>nums)
{
System.out.println("输入错误");
return;
}
Boy helper=first;
while(true){
if(helper.getNext()==first){
break;
}//直到helper到first的下一个退出
helper=helper.getNext();
}
for (int j=0;j<startNo-1;j++){
first=first.getNext();
helper=helper.getNext();
}
while(true){
if(first==helper)//只有一个
{
break;
}
for(int j=0;j<countNum-1;j++)
{
first=first.getNext();
helper=helper.getNext();
}
System.out.print("出圈");
System.out.println(first.getNo());
first=first.getNext();
helper.setNext(first);
}
System.out.print("留下来的小孩");
System.out.println(helper.getNo());
}
}
class Boy{
private int no;
private Boy next;
public Boy(int no)
{
this.no=no;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public Boy getNext() {
return next;
}
public void setNext(Boy next) {
this.next = next;
}
}