Java使用單鏈表實(shí)現(xiàn)約瑟夫環(huán)
本文實(shí)例為大家分享了Java使用單鏈表實(shí)現(xiàn)約瑟夫環(huán)的具體代碼,供大家參考,具體內(nèi)容如下
構(gòu)建一個(gè)單向的環(huán)形鏈表思路
1.先創(chuàng)建第一個(gè)節(jié)點(diǎn), 讓first指向該節(jié)點(diǎn), 并形成環(huán)形
2.后面當(dāng)我們每創(chuàng)建一個(gè)新的節(jié)點(diǎn), 就把該節(jié)點(diǎn)加入到已有的環(huán)形鏈表中即可.
遍歷環(huán)形鏈表思路
1.先讓一個(gè)輔助指針(變量)curBoy, 指向first節(jié)點(diǎn)
2.然后通過一個(gè)while循環(huán)遍歷該環(huán)形鏈表即可 curBoy.next == first 結(jié)束
生成小孩出圈順序的思路
1.根據(jù)用戶的輸入, 生成一個(gè)小孩出圈的順序
n = 5, 即有 5 個(gè)人
k = 1, 即從第1個(gè)人開始數(shù)數(shù)
m =2, 每次進(jìn)行數(shù)兩下
2.需求創(chuàng)建一個(gè)輔助指針(變量)helper, 事先應(yīng)該指向環(huán)形鏈表的最后這個(gè)節(jié)點(diǎn)
3.在小孩報(bào)數(shù)前, 讓first 指針和 helper指針分別指向正確的位置, 即需要移動(dòng) k-1次
4.在小孩報(bào)數(shù)時(shí), 每次讓first指針和helper指針移動(dòng) m-1次
5.此時(shí) first指針 指向的節(jié)點(diǎn)就是出圈的節(jié)點(diǎn)
代碼實(shí)現(xiàn)
first = frist.getNext(); helper.next = first;
由于first指向的節(jié)點(diǎn)數(shù)就沒有任何引用, 就會(huì)被回收
package com.beyond.linkedlist;
import org.omg.CORBA.PUBLIC_MEMBER;
public class Josepfu {
public static void main(String[] args){
CircleSingleLinkedList name = new CircleSingleLinkedList();
name.addBoy(5);
name.showBoy();
name.countBoy(1, 2, 5);
}
}
//創(chuàng)建一個(gè)環(huán)形的單向鏈表
class CircleSingleLinkedList {
// 創(chuàng)建一個(gè)first節(jié)點(diǎn),當(dāng)前沒有編號(hào)的
private Boy first = new Boy(-1);
// 添加小孩節(jié)點(diǎn),構(gòu)成一個(gè)環(huán)形的鏈表
public void addBoy(int nums) {
if (nums < 1) {
System.out.println("nums 的值不正常");
return;
}
Boy curBoy = null; // 輔助指針,幫助構(gòu)造環(huán)形鏈表
// 使用for來創(chuàng)建我們的環(huán)形鏈表
for (int i = 1; i <= nums; i++) {
// 根據(jù)編號(hào),創(chuàng)建小孩節(jié)點(diǎn)
Boy boy = new Boy(i);
// 如果是第一個(gè)小孩
if (i == 1) {
first = boy;
first.setNext(first);
curBoy = first;
} else {
curBoy.setNext(boy);
boy.setNext(first);
curBoy = boy;
}
}
}
// 遍歷當(dāng)前的環(huán)形鏈表
public void showBoy() {
if (first == null) {
System.out.println("沒有小孩!");
return;
}
// 因?yàn)閒irst不能動(dòng), 因此我們?nèi)匀皇褂靡粋€(gè)輔助指針完成遍歷
Boy curBoy = first;
while (true) {
System.out.printf("小孩的編號(hào)%d \n", curBoy.getNo());
if (curBoy.getNext() == first) {
break;
}
curBoy = curBoy.getNext(); // 后移
}
}
// 根據(jù)用戶的輸入,計(jì)算出小孩出圈的順序
/**
*
* @param startNo 表示從第幾個(gè)小孩開始數(shù)數(shù)
* @param countNum 表示數(shù)幾下
* @param nums 表示最初有多少個(gè)小孩在圈子中
*/
public void countBoy(int startNo, int countNum, int nums) {
if (first == null || startNo < 1 || startNo > nums) {
System.out.println("輸入數(shù)據(jù)有誤~");
return;
}
// 創(chuàng)建所需要的輔助指針,幫助小孩出圈
Boy helper = first;
// 需求創(chuàng)建一個(gè)輔助指針helper, 事先指向該環(huán)形列表的最后這個(gè)節(jié)點(diǎn)
while (true) {
if (helper.getNext() == first) {
break;
}
helper = helper.getNext();
}
//小孩報(bào)數(shù)前,將指針移動(dòng)到各自開始的位置,移動(dòng) k-1 次
for (int i = 0; i < startNo-1; i++) {
first = first.getNext();
helper = helper.getNext();
}
//當(dāng)小孩報(bào)數(shù)時(shí), 讓first 和 helper 指針同時(shí)移動(dòng) m-1次, 然后出圈
//這是一個(gè)循環(huán)操作,直到圈中只剩下一個(gè)小孩為止
while (true) {
if (helper == first) {
break;
}
for (int i = 0; i < countNum-1; i++) {
first = first.getNext();
helper = helper.getNext();
}
System.out.printf("小孩%d出圈!\n",first.getNo());
first = first.getNext();
helper.setNext(first);
}
System.out.printf("最后留在圈中的小孩編號(hào)為:%d",first.getNo());
}
}
//先創(chuàng)建一個(gè)Boy類, 表示一個(gè)節(jié)點(diǎn)
class Boy {
private int no;
private Boy next;
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;
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java動(dòng)態(tài)編譯執(zhí)行代碼示例
這篇文章主要介紹了Java動(dòng)態(tài)編譯執(zhí)行代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12
淺談Strut2如何對(duì)請(qǐng)求參數(shù)的封裝
這篇文章主要介紹了淺談Strut2如何對(duì)請(qǐng)求參數(shù)的封裝,具有一定借鑒價(jià)值,需要的朋友可以參考下2017-12-12
SpringBoot的jar包如何啟動(dòng)的實(shí)現(xiàn)
本文主要介紹了SpringBoot的jar包如何啟動(dòng)的實(shí)現(xiàn),文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
springboot+vue實(shí)現(xiàn)七牛云頭像的上傳
本文將介紹如何在Spring Boot項(xiàng)目中利用七牛云進(jìn)行圖片上傳并將圖片存儲(chǔ)在云存儲(chǔ)中,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08
SpringBoot2.4.2下使用Redis配置Lettuce的示例
這篇文章主要介紹了SpringBoot2.4.2下使用Redis配置Lettuce,Springboot2.4.2下默認(rèn)使用的就是Lettuce而不是Jedis因此無需在依賴進(jìn)行排除Jedis,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2022-01-01
IntelliJ IDEA本地代碼提交到github網(wǎng)站不顯示與本地不同步問題的解決辦法
今天小編就為大家分享一篇關(guān)于IntelliJ IDEA本地代碼提交到github網(wǎng)站不顯示與本地不同步問題的解決辦法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10
基于SpringBoot實(shí)現(xiàn)自定義插件的流程詳解
在SpringBoot中,插件是一種擴(kuò)展機(jī)制,它可以幫助我們?cè)趹?yīng)用程序中快速地添加一些額外的功能,在本文中,我們將介紹如何使用 SpringBoot實(shí)現(xiàn)自定義插件,需要的朋友可以參考下2023-06-06
SpringCloud中NacosNamingService的作用詳解
這篇文章主要介紹了SpringCloud中NacosNamingService的作用詳解,NacosNamingService類完成服務(wù)實(shí)例注冊(cè),撤銷與獲取服務(wù)實(shí)例操作,NacosNamingService初始化采用單例模式,使用反射生成,需要的朋友可以參考下2023-11-11

