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)動(dòng)態(tài)驗(yàn)證碼生成
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)動(dòng)態(tài)驗(yàn)證碼生成,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04使用IDEA創(chuàng)建SpringBoot項(xiàng)目的方法步驟
這篇文章主要介紹了使用IDEA創(chuàng)建SpringBoot項(xiàng)目的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05dubbo新手學(xué)習(xí)之事件通知實(shí)踐教程
這篇文章主要給大家介紹了關(guān)于dubbo新手學(xué)習(xí)之事件通知實(shí)踐的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09