java基于雙向環(huán)形鏈表解決丟手帕問題的方法示例
本文實(shí)例講述了java基于雙向環(huán)形鏈表解決丟手帕問題的方法。分享給大家供大家參考,具體如下:
問題:設(shè)編號為1、2……n的幾個(gè)小孩圍坐一圈,約定編號為k(1=<k<=n)的小孩從1開始報(bào)數(shù),數(shù)到m的那個(gè)出列,他的下一位又從1開始報(bào)數(shù),數(shù)到m的那個(gè)人又出列,直到所有人出列為止,由此產(chǎn)生一個(gè)出隊(duì)編號的序列。
我們現(xiàn)在用一個(gè)雙向環(huán)形鏈表來解這一問題。先來看看下面這幅圖:

圓圈代表一個(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("腳本之家測試結(jié)果:");
cl.print();
cl.setK(2); //設(shè)置從第幾個(gè)小孩開始數(shù)數(shù)
cl.setM(3); //設(shè)置數(shù)幾下
cl.play(); //開始游戲
}
}
class Child{
int no;
Child nextChild;
Child previousChild;
public Child(int no){
this.no=no;
}
}
class CycleLink{
Child first;
Child cursor;
int length;
//從第幾個(gè)小孩開始數(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();
}
//開始游戲
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ù)韓順平的視頻的。不過他用的是一個(gè)單向的鏈表,上面的代碼注釋的部分是用來找cursor所指向的元素的上一個(gè)元素的,是將整個(gè)鏈表轉(zhuǎn)了一圈來實(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緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計(jì)有所幫助。
- Java用單向環(huán)形鏈表來解決約瑟夫環(huán)Josepfu問題
- 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簡單實(shí)現(xiàn)約瑟夫環(huán)算法示例
- java使用鏈表實(shí)現(xiàn)約瑟夫環(huán)
- Java數(shù)據(jù)結(jié)構(gòu)之環(huán)形鏈表和約瑟夫問題詳解
相關(guān)文章
Java面試題之HashSet的實(shí)現(xiàn)原理
這篇文章主要介紹了Java面試題之HashSet的實(shí)現(xiàn)原理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
Java中通過sftp協(xié)議實(shí)現(xiàn)上傳下載的示例代碼
在java開發(fā)中遇到需要將linux系統(tǒng)中指定目錄下的文件下載到windows本地的需求,本文就來介紹Java中通過sftp協(xié)議實(shí)現(xiàn)上傳下載,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06
springboot項(xiàng)目如何引用公共模塊的bean
這篇文章主要介紹了springboot項(xiàng)目如何引用公共模塊的bean問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
Springboot發(fā)送post請求的幾種方式總結(jié)
這篇文章主要為大家詳細(xì)介紹了Springboot發(fā)送post請求的幾種方式,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴可以了解一下2024-01-01
微信小程序調(diào)用微信登陸獲取openid及java做為服務(wù)端示例
這篇文章主要介紹了微信小程序調(diào)用微信登陸獲取openid及java做為服務(wù)端示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01

