import java.util.Scanner;
public class Josephu {
public static void main(String[] args){
Scanner s=new Scanner(System.in);
CircleLinkedList circleLinkedList=new CircleLinkedList();
boolean flag=true;
while(flag){
System.out.println("1.请创建循环单链表");
System.out.println("2.请输入出圈的规则并输出出圈顺序");
System.out.println("3.请显示循环单链表");
System.out.println("4.退出");
System.out.print("请您输入要执行功能的序号:");
int x=s.nextInt();
switch(x){
case 1:
System.out.print("请您输入丢手绢的小孩数量:");
int nums=s.nextInt();
circleLinkedList.createCircleLinkedList(nums);
System.out.println("创建循环单链表成功!");
break;
case 2:
System.out.print("请您输入从第几个孩子节点报数的序号:");
int k=s.nextInt();
System.out.print("请您输入每隔多少人报数:");
int m=s.nextInt();
System.out.print("请您输入刚开始一共有多少个孩子节点:");
int num=s.nextInt();
circleLinkedList.exitCircleLinkedList(k, m, num);
break;
case 3:
circleLinkedList.showCircleLinkedList();
break;
case 4:
s.close();
flag=false;
System.out.println("当前程序结束!");
break;
default:
System.out.println("请输入1-4有效序号!");
break;
}
}
}
}
class CircleLinkedList{
CircleNode first=null;
//根据输入小孩的数量创建循环单链表(序号:1-nums)
public void createCircleLinkedList(int nums){
//创建一共遍历链表的指针temp
CircleNode temp=null;
for(int i=1;i<=nums;i++){
CircleNode node=new CircleNode(i);
if(i==1){//第一个小孩节点单独考虑,让它自己一个人形成环状
first=node;
first.next=first;
temp=first;
}else{
temp.next=node;
node.next=first;
//temp=temp.next;
temp=node;
}
}
}
/**
*
* @param k表示从k个节点报数
* @param m表示数几下
* @param nums表示开始有多少个节点
*/
public void exitCircleLinkedList(int k,int m,int nums){
// 先对数据进行校验
if (first == null || k < 1 || k > nums) {
System.out.println("参数输入有误, 请重新输入");
return;
}
CircleNode temp=first;
//先把temp指针定义在first指针后面
while(temp.next!=first){
temp=temp.next;
}
//从k个节点报数,则需要把temp和first指针往前移动k-1次
for(int i=0;i<k-1;i++){
first=first.next;
temp=temp.next;
}
System.out.println("出圈顺序如下:");
while(temp!=first){
for(int i=0;i<m-1;i++){
first=first.next;
temp=temp.next;
}
//此时first指向的要出圈的孩子节点
System.out.println("no="+first.no);
first=first.next;
temp.next=first;
}
//最后一个节点单独输出
System.out.println(temp);
}
public void showCircleLinkedList(){
CircleNode temp=first;
if(first==null){
System.out.println("循环链表为空!");
return;
}
while(true){
System.out.println(temp);
if(temp.next==first){
break;
}
temp=temp.next;
}
}
}
class CircleNode{
int no;
CircleNode next;
public CircleNode(int no){
this.no=no;
}
public String toString(){
return "no="+no;
}
}
约瑟夫环问题(循环单链表求解)
最新推荐文章于 2024-02-22 09:51:45 发布