package com.company;
//单链表的创建带头节点的
import java.awt.*;
class ist{
public static void main(String[] args) {
CircleSingleLinkedList circleSingleLinkedList=new CircleSingleLinkedList();
circleSingleLinkedList.addBoy(5);
circleSingleLinkedList.countboy(1,2,5);
}
}
//创建一个环形的单向链表
class CircleSingleLinkedList{
//创建一个first节点,当前灭有编号
private Boy first=null;
///添加小孩节点,构建成一个环形链表
public void addBoy(int nums){
//先对一个num做一个数据校验
if(nums<1){
System.out.println("数据小于1");
return;
}//使用for循环来创建我们的环形链表
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 countboy(int startNo,int countnum,int nums){
if (first==null|| startNo<1||startNo>nums){
System.out.println("队列为空");
return;
}else {
//创建一个辅助指针
Boy helper=first;
while(true){
if (helper.getNext()==first){
System.out.println("指向最后了");
break;
}
helper=helper.getNext();
}
//小孩报数前,先让first和helpwer移动k-1此
for(int j=0;j<startNo-1;j++){
first.getNext();
helper.getNext();
}
while(true){
if (helper==first){
break;
}
for(int j=0;j<countnum-1;j++){
first=first.getNext();
helper=helper.getNext();
}//这时小孩出圈的节点就是firstg
System.out.printf("小孩%d出圈\n",first.getNo());
first=first.getNext();
helper.setNext(first);
}
System.out.printf("最后留在圈中的小孩编号是%d",first.getNo());
}
}
//遍历出当前的环形链表
public void showList(){
//链表是否为空
if(first==null){
System.out.println("链表为空");
return;
}else{//因为first不能动。因此需要使用辅助指针完成遍历
Boy curBoy=first;
while(true){
System.out.printf("小孩的编号%d\n",curBoy.getNo());
if (curBoy.getNext()==first){
break;
}
curBoy=curBoy.getNext();//curboy后裔
}
}
}
}
//创建一个boy类,表示一个节点
class Boy{
private int no;
private Boy next;
public Boy(){
}
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;
}
}