資料結構 環形單鏈表解決約瑟夫問題

2021-10-01 11:55:28 字數 2116 閱讀 9189

1.單向環形鍊錶使用場景:

joseph問題:設編號為1,2,3…n的小朋友圍成一圈,設定編號為k的人開始報數,數到m的那個人出列,他的下一位從1開始又重新報數,依次類推,直到所有人出列。

思路分析:用乙個不帶頭節點的環形鍊錶來處理,先構成乙個有n個節點的環形單鏈表,然後由k節點開始報數,報到m時,對應節點刪除,然後再從被刪除的節點下乙個節點開始計數,知道最後乙個節點被刪除演算法結束。

2.單向環形鍊錶結構:

3.建立環形列表思路**:

4.小孩出圈**思路:

5.具體**實現:

public

class

annularsinglelinked

//輔助指標,主要是構建環形列表

boy cur = null;

//建立環形單鏈表

for(

int i =

1; i

)else}}

//展示

public

void

list()

//輔助指標,指向first

boy temp = first;

while

(true

) temp = temp.nextboy;}}

// 根據使用者的輸入,計算出小孩出圈的順序

/** *

* @param startno

* 表示從第幾個小孩開始數數

* @param countnum

* 表示數幾下

* @param nums

* 表示最初有多少小孩在圈中

*/public

void

countboy

(int startno,

int countnum,

int nums)

// 建立輔助指標,幫助完成小孩出圈

boy helper = first;

// 需求建立乙個輔助指標(變數) helper , 事先應該指向環形鍊錶的最後這個節點

while

(true

) helper = helper.nextboy;

}//小孩報數前,先讓 first 和 helper 移動 k - 1次

for(

int j =

0; j < startno -

1; j++

)//當小孩報數時,讓first 和 helper 指標同時 的移動 m - 1 次, 然後出圈

//這裡是乙個迴圈操作,知道圈中只有乙個節點

while

(true

)//讓 first 和 helper 指標同時 的移動 countnum - 1

for(

int j =

0; j < countnum -

1; j++

)//這時first指向的節點,就是要出圈的小孩節點

system.out.

printf

("小孩%d出圈\n"

, first.num)

;//這時將first指向的小孩節點出圈

first = first.nextboy;

helper.nextboy = first;

} system.out.

printf

("最後留在圈中的小孩編號%d \n"

, first.num);}

}//boy

public

class

boy}

資料結構 環形單鏈表的約瑟夫問題

環形單鏈表的約瑟夫問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再...

約瑟夫問題,用java單鏈表解決

設編號為1,2,3.n,的n個人圍坐一圈,約定編號為k 1的人從1開始報數,數到m的那個人出列,它的下一位又從1開始報數,數到m的人又出列,以此類推,直到所有人出列為止,由此產生乙個出隊編號的序列 由k節點起從1開始計數,計到m時,對應節點從鍊錶中刪除,然後再從被刪除節點的下乙個節點 又從1開始計數...

運用迴圈單鏈表解決約瑟夫環問題

include using namespace std struct node 構造結點 為結點初始化 分配空間 int data node next class josephus void create 鍊錶的初始化 void output 輸出數值 private node head 迴圈鍊錶的...