java基于雙向環(huán)形鏈表解決丟手帕問(wèn)題的方法示例
本文實(shí)例講述了java基于雙向環(huán)形鏈表解決丟手帕問(wèn)題的方法。分享給大家供大家參考,具體如下:
問(wèn)題:設(shè)編號(hào)為1、2……n的幾個(gè)小孩圍坐一圈,約定編號(hào)為k(1=<k<=n)的小孩從1開(kāi)始報(bào)數(shù),數(shù)到m的那個(gè)出列,他的下一位又從1開(kāi)始報(bào)數(shù),數(shù)到m的那個(gè)人又出列,直到所有人出列為止,由此產(chǎn)生一個(gè)出隊(duì)編號(hào)的序列。
我們現(xiàn)在用一個(gè)雙向環(huán)形鏈表來(lái)解這一問(wèn)題。先來(lái)看看下面這幅圖:
圓圈代表一個(gè)結(jié)點(diǎn),紅色的指針指向下一個(gè)元素,紫色的指針指向上一個(gè)元素。first指針指向第一個(gè)元素,表明第一個(gè)元素的位置,cursor是游標(biāo)指針,它的作用重大。那么這個(gè)環(huán)形的鏈表就可以模擬小孩排成的圓圈,下面是具體的代碼:
public class Test { public static void main(String[] args){ CycleLink cl=new CycleLink(5); //構(gòu)造環(huán)形鏈表 System.out.println("腳本之家測(cè)試結(jié)果:"); cl.print(); cl.setK(2); //設(shè)置從第幾個(gè)小孩開(kāi)始數(shù)數(shù) cl.setM(3); //設(shè)置數(shù)幾下 cl.play(); //開(kāi)始游戲 } } class Child{ int no; Child nextChild; Child previousChild; public Child(int no){ this.no=no; } } class CycleLink{ Child first; Child cursor; int length; //從第幾個(gè)小孩開(kāi)始數(shù) private int k=1; //數(shù)幾下 private int m=1; //構(gòu)造函數(shù) public CycleLink(int len){ this.length=len; for(int i=1;i<=length;i++){ Child ch=new Child(i); if(i==1){ first=ch; cursor=ch; }else if(i<length){ cursor.nextChild=ch; ch.previousChild=cursor; cursor=ch; }else { cursor.nextChild=ch; ch.previousChild=cursor; cursor=ch; ch.nextChild=first; first.previousChild=ch; } } } //打印鏈表 public void print(){ cursor=first; do{ System.out.print(cursor.no+"<<"); cursor=cursor.nextChild; }while(cursor!=first); System.out.println(); } //開(kāi)始游戲 public void play(){ Child temp; cursor=first; //先找到第k個(gè)小孩 while(cursor.no<k){ cursor=cursor.nextChild; } while(length>1){ //數(shù)m下 for(int i=1;i<m;i++){ cursor=cursor.nextChild; } System.out.println("小孩"+cursor.no+"出局了!"); //找到前一個(gè)小孩 temp=cursor.previousChild; // temp=cursor; // do{ // temp=temp.nextChild; // }while(temp.nextChild!=cursor); temp.nextChild=cursor.nextChild; cursor.nextChild.previousChild=temp; cursor=cursor.nextChild; length--; } System.out.println("最后一個(gè)出局的小孩是"+cursor.no); } public void setK(int k) { this.k = k; } public void setM(int m) { this.m = m; } }
這個(gè)代碼的基本框架是根據(jù)韓順平的視頻的。不過(guò)他用的是一個(gè)單向的鏈表,上面的代碼注釋的部分是用來(lái)找cursor所指向的元素的上一個(gè)元素的,是將整個(gè)鏈表轉(zhuǎn)了一圈來(lái)實(shí)現(xiàn)的。這里我改成了雙向鏈表,直接用一個(gè)cursor.previousChild
就可以了。
運(yùn)行結(jié)果:
更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
- Java用單向環(huán)形鏈表來(lái)解決約瑟夫環(huán)Josepfu問(wèn)題
- Java數(shù)據(jù)結(jié)構(gòu)與算法之雙向鏈表、環(huán)形鏈表及約瑟夫問(wèn)題深入理解
- Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之環(huán)形鏈表
- java 實(shí)現(xiàn)約瑟夫環(huán)的實(shí)例代碼
- Java解決約瑟夫問(wèn)題代碼實(shí)例
- Java簡(jiǎn)單實(shí)現(xiàn)約瑟夫環(huán)算法示例
- java使用鏈表實(shí)現(xiàn)約瑟夫環(huán)
- Java數(shù)據(jù)結(jié)構(gòu)之環(huán)形鏈表和約瑟夫問(wèn)題詳解
相關(guān)文章
SpringBoot中的靜態(tài)資源訪問(wèn)的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot中的靜態(tài)資源訪問(wèn)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09java連接sql server 2008數(shù)據(jù)庫(kù)代碼
Java的學(xué)習(xí),很重要的一點(diǎn)是對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作。2013-03-03Java單表實(shí)現(xiàn)評(píng)論回復(fù)功能(多種實(shí)現(xiàn)方式)
這篇文章主要介紹了Java單表實(shí)現(xiàn)評(píng)論回復(fù)功能,大家都知道評(píng)論功能有多種實(shí)現(xiàn)方式,本文逐一給大家詳細(xì)講解,需要的朋友可以參考下2023-03-03@Value注入List、數(shù)組、Set、Map問(wèn)題
這篇文章主要介紹了@Value注入List、數(shù)組、Set、Map問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07java實(shí)現(xiàn)發(fā)送email小案例
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)發(fā)送email小案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02