java作业7.17
package com.mx.test;
import java.util.Scanner;
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;//从第k个小孩开始报数
int m=0;
public void setM(int m){//第m个人出局
this.m=m;
}
public void setLen(int len){//设置链表的大小
this.len=len;
}
public void setK(int k){//设置链表的大小
this.k=k;
}
public void play(){
Child temp=this.firstChild;
for(int i=1;i<k;i++){//找到开始报数的位置
temp=temp.nextChild;
}
while(this.len!=1){
for(int j=1;j<m;j++){
temp=temp.nextChild;
}//temp是出圈的号码
System.out.println("出圈的小孩编号:"+temp.num);//输出出圈小孩编号
Child temp1=temp;
while(temp1.nextChild!=temp){
temp1=temp1.nextChild;
}//temp1取到了出圈的前一个号码
temp1.nextChild=temp.nextChild;//temp1的下一个指向出圈孩子的下一个
temp=temp.nextChild;//temp取到下一轮第一个开始数的数
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 class LianBiaoTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
CycLink cyclink=new CycLink();
int i,j,k;
Scanner sc = new Scanner(System.in);
System.out.print("请输入共有几个小孩参与了游戏:");
i = sc.nextInt();
System.out.print("请输入从第几个小孩开始游戏:");
j = sc.nextInt();
System.out.print("请输入数到哪个数的人出局:");
k = sc.nextInt();
cyclink.setLen(i);//链表长度
cyclink.createLink();//创建链表
cyclink.setK(j);//从第几个编号开始游戏
cyclink.setM(k);//数几下
cyclink.play();
}
}