数据结构 环形链表(约瑟夫环)

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);
    }
}

猜你喜欢

转载自blog.csdn.net/guyjy/article/details/106605827