josephe约瑟夫问题-使用环形链表解决问题
约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,S=1,被杀掉的顺序是:5,4,6,2,3,1。(N为该总人数,M为数的对应的人出列,S为开始的编号)。
环形链表的结构如下所示:
public class Person {//定义一个节点
private int no;//定义一个编号
private Person next;//指针
public void setNo(int no) {
this.no = no;
}
public void setNext(Person next) {
this.next = next;
}
public int getNo() {
return no;
}
public Person getNext() {
return next;
}
public Person(int no){//有参构造函数初始化,将学号初始化
this.no=no;
}
}
定义一个链表,链表结构如下:
public class CilcleSingleLinkList {
private Person First=null;//定义一个头指针
//添加函数
/**
*@nums 人的个数
*/
public void add(int nums){
//判断输入的人数是否符合实际情况
if(nums<1){
System.out.println("nums的值不正确");
return;
}
Person curBoy=null;
for (int i=1;i<=nums;i++){
Person boy=new Person(i);
if (i==1){
First=boy;
First.setNext(First);
curBoy=First;
}else{
curBoy.setNext(boy);
boy.setNext(First);
curBoy=boy;
}
}
}
public void list(){
if(First==null){
System.out.println("链表为空");
return;
}
Person curBoy=First;
while (true){
System.out.println("小孩的编号:"+curBoy.getNo());
if (curBoy.getNext()==First){
break;
}
curBoy=curBoy.getNext();
}
}
/**
*
* @param startBoy 开始的数数的小孩
* @param countnum 表示数几下出队
* @param nums 最初由多少小孩在环形单链表中
*/
public void CountBoy(int startBoy,int countnum,int nums){
if(First==null || startBoy<1 || startBoy>nums){
System.out.println("参数输入有误,请重新输入");
return;
}
Person helper=First;
while (true){
if (helper.getNext()==First){
break;
}
helper=helper.getNext();
}
for (int j=0;j<startBoy-1;j++){
First=First.getNext();
helper=helper.getNext();
}
while (true){
if(helper==First){
break;
}
for(int i=0;i<countnum-1;i++){
First=First.getNext();
helper=helper.getNext();
}
System.out.println("出圈的小孩为:"+First.getNo());
First=First.getNext();
helper.setNext(First);
}
System.out.println("出圈的小孩为:"+First.getNo());
}
}
```java
public class CilcleSingleLinkListDemo {
public static void main(String[] args) {
CilcleSingleLinkList cilcleSingleLinkList=new CilcleSingleLinkList();
cilcleSingleLinkList.add(5);
cilcleSingleLinkList.list();
//出圈的顺序
cilcleSingleLinkList.CountBoy(1,3,5);
}
}
运行结果: