Java用單向環(huán)形鏈表來解決約瑟夫環(huán)Josepfu問題
簡(jiǎn)單介紹
如果把單鏈表的最后一個(gè)節(jié)點(diǎn)的指針指向鏈表頭部,而不是指向NULL,那么就構(gòu)成了一個(gè)單向循環(huán)鏈表,通俗講就是讓尾節(jié)點(diǎn)指向頭結(jié)點(diǎn)。

單向環(huán)形鏈表應(yīng)用場(chǎng)景:Josephu(約瑟夫、約瑟夫環(huán))問題:
設(shè)編號(hào)為1, 2, … n的n個(gè)人圍坐一圈,約定編號(hào)為k (1<=k<=n)的人從1開始報(bào)數(shù),數(shù)到m的那個(gè)人出列,它的下一位又從1開始報(bào)數(shù),數(shù)到m的那個(gè)人又出列,依次類推,直到所有人出列為止,由此產(chǎn)生一個(gè)出隊(duì)編號(hào)的序列。
代碼實(shí)現(xiàn)
節(jié)點(diǎn)類
//節(jié)點(diǎn)類
class JNode {
private int id;
private JNode next;
public JNode(int id) {
this.id = id;
}
public int getId() {
return id;
}
public JNode getNext() {
return next;
}
public void setNext(JNode next) {
this.next = next;
}
}
鏈表類(包括節(jié)點(diǎn)管理和約瑟夫環(huán)問題解決)
//鏈表類
class CircleSingleLinkedList {
private JNode first = null; //定義第一個(gè)節(jié)點(diǎn),未創(chuàng)建時(shí)為null
//添加節(jié)點(diǎn),構(gòu)建環(huán)形鏈表
public void add(int num) {
if (num < 1){
System.out.println("創(chuàng)建個(gè)數(shù)不符合規(guī)定!");
return;
}
JNode curNode = null; //輔助變量
for (int i = 1; i <= num; i++) {
JNode newNode = new JNode(i);
if (i == 1){ //第一個(gè)節(jié)點(diǎn)較為特殊
first = newNode; //真正創(chuàng)建了第一個(gè)節(jié)點(diǎn)
first.setNext(first); //形成環(huán)狀
curNode = first; //讓輔助變量開始作用
}else { //第二個(gè)及其之后節(jié)點(diǎn)
curNode.setNext(newNode); //讓當(dāng)前節(jié)點(diǎn)指向新建的節(jié)點(diǎn)
newNode.setNext(first); //讓新建的節(jié)點(diǎn)指向第一個(gè)節(jié)點(diǎn),形成環(huán)狀
curNode = newNode; //更新輔助變量
}
}
}
//遍歷鏈表
public void list(){
if (first == null){
System.out.println("鏈表為空!");
return;
}
JNode temp = first;
while (true){
System.out.printf("取出節(jié)點(diǎn)%d\n",temp.getId());
if (temp.getNext() == first){ //說明已經(jīng)遍歷到最后一個(gè)了
break;
}
temp = temp.getNext();
}
}
//根據(jù)參數(shù)讓節(jié)點(diǎn)出圈(Josepfu)
public void josepfu(int startNode,int count,int num){ //startNode為開始的那個(gè)節(jié)點(diǎn),count為每次數(shù)第幾個(gè),num為鏈表節(jié)點(diǎn)個(gè)數(shù)
if (first == null || startNode < 1 || count < 1 || startNode > num){
System.out.println("鏈表為空或者輸入的參數(shù)不符合標(biāo)準(zhǔn)!");
return;
}
//讓first移動(dòng)到startNode指定的節(jié)點(diǎn),即移動(dòng)startNode-1次
for (int i = 0; i < startNode - 1; i++) {
first = first.getNext();
}
//創(chuàng)建一個(gè)輔助變量,讓其指向最后一個(gè)節(jié)點(diǎn)(first前一個(gè))
JNode helper = first;
while (helper.getNext() != first){
helper = helper.getNext();
}
//開始按照要求出圈,每次都讓helper和first移動(dòng)count-1次
while (true){
if (helper == first){ //圈中只剩下一個(gè)節(jié)點(diǎn)
break;
}
for (int i = 0; i < count - 1; i++) {
first = first.getNext();
helper = helper.getNext();
}
//此時(shí)first指向的即為要出圈的節(jié)點(diǎn)
System.out.printf("節(jié)點(diǎn)%d出圈\n",first.getId());
//將出圈的節(jié)點(diǎn)從鏈表中移除
first = first.getNext();
helper.setNext(first);
}
System.out.printf("節(jié)點(diǎn)%d為最后一個(gè)節(jié)點(diǎn)",first.getId());
}
}
測(cè)試類
/**
* @Author: Yeman
* @Date: 2021-10-15-22:33
* @Description:
*/
public class JosepfuTest {
public static void main(String[] args) {
CircleSingleLinkedList linkedList = new CircleSingleLinkedList();
linkedList.add(5);
linkedList.list();
System.out.println("===================");
linkedList.josepfu(1,2,5);
}
}
到此這篇關(guān)于Java用單向環(huán)形鏈表來解決約瑟夫環(huán)Josepfu問題的文章就介紹到這了,更多相關(guān)Java 單向環(huán)形鏈表 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java基于雙向環(huán)形鏈表解決丟手帕問題的方法示例
- Java數(shù)據(jù)結(jié)構(gòu)與算法之雙向鏈表、環(huán)形鏈表及約瑟夫問題深入理解
- Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之環(huán)形鏈表
- java 實(shí)現(xiàn)約瑟夫環(huán)的實(shí)例代碼
- Java解決約瑟夫問題代碼實(shí)例
- Java簡(jiǎn)單實(shí)現(xiàn)約瑟夫環(huán)算法示例
- java使用鏈表實(shí)現(xiàn)約瑟夫環(huán)
- Java數(shù)據(jù)結(jié)構(gòu)之環(huán)形鏈表和約瑟夫問題詳解
相關(guān)文章
java實(shí)現(xiàn)點(diǎn)擊按鈕彈出新窗體功能
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)點(diǎn)擊按鈕彈出新窗體功能,舊窗體不進(jìn)行操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
Java List轉(zhuǎn)換成String數(shù)組幾種實(shí)現(xiàn)方式詳解
這篇文章主要介紹了Java List轉(zhuǎn)換成String數(shù)組幾種實(shí)現(xiàn)方式詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12
Java通俗易懂系列設(shè)計(jì)模式之責(zé)任鏈模式
這篇文章主要介紹了Java通俗易懂系列設(shè)計(jì)模式之責(zé)任鏈模式,對(duì)設(shè)計(jì)模式感興趣的同學(xué),一定要看一下2021-04-04
eclipse下整合springboot和mybatis的方法步驟
這篇文章主要介紹了eclipse下整合springboot和mybatis的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03
Springcloud+Mybatis使用多數(shù)據(jù)源的四種方式(小結(jié))
這篇文章主要介紹了Springcloud+Mybatis使用多數(shù)據(jù)源的四種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Mybatis-Plus之ID自動(dòng)增長(zhǎng)的設(shè)置實(shí)現(xiàn)
本文主要介紹了Mybatis-Plus之ID自動(dòng)增長(zhǎng)的設(shè)置實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
Spring之ShutDown?Hook死鎖現(xiàn)象解讀
這篇文章主要介紹了Spring之ShutDown?Hook死鎖現(xiàn)象解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
logback的ShutdownHook關(guān)閉原理解析
這篇文章主要為大家介紹了logback的ShutdownHook關(guān)閉原理源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
使用IDEA搭建Hadoop開發(fā)環(huán)境的操作步驟(Window10為例)
經(jīng)過三次重裝,查閱無數(shù)資料后成功完成hadoop在win10上實(shí)現(xiàn)偽分布式集群,以及IDEA開發(fā)環(huán)境的搭建。一步一步跟著本文操作可以避免無數(shù)天坑2021-07-07

