Java采用循環(huán)鏈表結(jié)構(gòu)求解約瑟夫問題
本文實(shí)例講述了Java采用循環(huán)鏈表結(jié)構(gòu)求解約瑟夫問題的方法。分享給大家供大家參考。具體分析如下:
這是第一次java考試的試題,對(duì)于沒看過鏈表的同學(xué)來說就不會(huì)做,現(xiàn)在回頭看看,還真不難。
約瑟夫問題:
有n個(gè)人,其編號(hào)分別為1,2,3,…,n。這n個(gè)人按順序排成一個(gè)圈?,F(xiàn)在給定s和d,從第s個(gè)人開始從1依次報(bào)數(shù),數(shù)到d的人出列,然后又從下一個(gè)人開始又從1開始依次報(bào)數(shù),數(shù)到d的人又出列,如此循環(huán),直到最后所有人出列為止。要求定義一個(gè)節(jié)點(diǎn)類,采用循環(huán)鏈表結(jié)構(gòu)求解約瑟夫問題。
以下java版的答案:
public class LinkNode { //單向鏈表的節(jié)點(diǎn)類
public int data; //存放節(jié)點(diǎn)值
public LinkNode next; //存放節(jié)點(diǎn)值的引用
public LinkNode(int k){ //構(gòu)造方法 ,值為k的節(jié)點(diǎn)
data = k;
next= null;
}
}
class Josephus{
public static void printJosephus(int n,int s,int d){
int i=1; //創(chuàng)建長(zhǎng)為n的循環(huán)列表
LinkNode q,tail;
LinkNode head = new LinkNode(i);
head.next = head ;
tail = head; //第一個(gè)節(jié)點(diǎn),尾巴和頭在一起
while(i<n){
i++;
q = new LinkNode(i); //增加一個(gè)新節(jié)點(diǎn)
q.next = head ; //節(jié)點(diǎn)的引用指向頭
tail.next = q; //最后一個(gè)元素的引用指向了q
tail = q; //那么最后一個(gè)元素就是q
}
int j= 0; //從s開始報(bào)數(shù),依次輸出出列人的編號(hào)
LinkNode p = head; //計(jì)數(shù)起點(diǎn)
while(j<s-1){
j++;
p = p.next;
}
while(p.next != p){
j = 1;
while(j<d-1) //計(jì)數(shù)的起始點(diǎn)
{
j++;
p = p.next;
}
System.out.print(p.next.data + " "); // 輸出出列的節(jié)點(diǎn)號(hào)
p.next = p.next.next;
p = p.next; //不斷指向下一個(gè)節(jié)點(diǎn)
}
System.out.print(p.data);
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int a = input.nextInt();
int b = input.nextInt();
Josephus.printJosephus(n, a, b);
}
}
希望本文所述對(duì)大家的Java程序設(shè)計(jì)有所幫助。
相關(guān)文章
關(guān)于SpringBoot整合redis使用Lettuce客戶端超時(shí)問題
使用到Lettuce連接redis,一段時(shí)間后不操作,再去操作redis,會(huì)報(bào)連接超時(shí)錯(cuò)誤,在其重連后又可使用,糾結(jié)是什么原因?qū)е碌哪兀旅嫘【幗o大家?guī)砹薙pringBoot整合redis使用Lettuce客戶端超時(shí)問題及解決方案,一起看看吧2021-08-08springBoot熱部署、請(qǐng)求轉(zhuǎn)發(fā)與重定向步驟詳解
這篇文章主要介紹了springBoot熱部署、請(qǐng)求轉(zhuǎn)發(fā)與重定向,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06Java 判斷兩個(gè)字符串是否由相同的字符組成的實(shí)例
今天小編就為大家分享一篇Java 判斷兩個(gè)字符串是否由相同的字符組成的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07Java 的 FileFilter文件過濾與readline讀行操作實(shí)例代碼
這篇文章介紹了Java 的 FileFilter文件過濾與readline讀行操作實(shí)例代碼,有需要的朋友可以參考一下2013-09-09Java 數(shù)組聲明、創(chuàng)建、初始化詳解
本文主要介紹Java 數(shù)組聲明、創(chuàng)建、初始化的資料,這里整理相關(guān)知識(shí),及簡(jiǎn)單實(shí)現(xiàn)代碼,幫助大家學(xué)習(xí),有興趣的小伙伴可以參考下2016-09-09Java向List集合中批量添加元素的實(shí)現(xiàn)方法
這篇文章主要介紹了Java向List集合中批量添加元素的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05Springboot AOP對(duì)指定敏感字段數(shù)據(jù)加密存儲(chǔ)的實(shí)現(xiàn)
本篇文章主要介紹了利用Springboot+AOP對(duì)指定的敏感數(shù)據(jù)進(jìn)行加密存儲(chǔ)以及對(duì)數(shù)據(jù)中加密的數(shù)據(jù)的解密的方法,代碼詳細(xì),具有一定的價(jià)值,感興趣的小伙伴可以了解一下2021-11-11Spring5+SpringMvc+Hibernate5整合的實(shí)現(xiàn)
這篇文章主要介紹了Spring5+SpringMvc+Hibernate5整合的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06Java 內(nèi)省introspector相關(guān)原理代碼解析
這篇文章主要介紹了Java 內(nèi)省introspector相關(guān)原理代碼解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07