package com.数据结构;
import java.util.Scanner;
public class 环形链表_约瑟夫环 {
//有n个人围成一圈,顺序从1开始排号。从第m个人开始报数(从1到3报数),凡报到k的人退出圈子.
// 问最后留下的是原来第几号的那位。要求用循环链表实现。
//环形链表 (约瑟夫环) ----- 其实没学数据结构之前我就用环形链表做出来了,hahahhah
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
YouXi youXi = new YouXi(n,1,3);
youXi.sheng();
youXi.out();
}
}
class YouXi{
public int n ;
public int m ;
public int k ;
public Boy is ; //初始化后指向第一个位置
public Boy ok ; //初始化后指向最后一个位置
public YouXi(int n, int m, int k) { //一共n个小朋友 从第m个人开始 报到k出圈
this.n = n;
this.m = m;
this.k = k;
}
public void sheng(){ //生成环形链表
for(int i=1;i<=n;i++){ //生成n个小孩
if(i==1){
is = new Boy(i);
ok = is ;
is.next = is ;
}else{
ok.next = new Boy(i);
ok = ok .next ;
ok.next = is ;
}
}
for(int i=0;i<m-1;i++){ //将两个指针移到指定位置
is = is.next;
ok = ok.next;
}
}
public void out(){
while(is!=ok){
for(int i=0;i<k-1;i++){
is = is.next;
ok = ok.next;
}
// System.out.println(is);
is = is.next;
ok.next = is;
}
System.out.println(is);
}
public void printf(){ //打印链表情况
if(is==null) return ;
Boy temp = is ;
for(int i=0;i<n;i++){
System.out.println(temp);
temp = temp.next ;
}
}
}
class Boy{ //小孩
public int id ; //编号
public Boy next ;
public Boy(int id) {
this.id = id;
}
@Override
public String toString() {
return String.valueOf(this.id);
}
}
数据结构 环形链表(约瑟夫环)
最新推荐文章于 2022-11-14 23:20:28 发布