演算法與資料結構學習(9) 環形鍊錶及約瑟夫問題

2021-10-02 22:28:52 字數 2831 閱讀 3631

鍊錶中每個節點的指標域是單向的,指向下乙個節點,並且最後乙個節點的next指標指向第乙個節點,這樣就形成了乙個閉環,這樣的鍊錶結構就是單向迴圈鍊錶,它可以用於解決約瑟夫問題

josephu問題:

設編號為1,2,3,…n的n個人圍坐一圈,約定編號為k(1<=k<=n)的人從1開始報數,數到m的那個人出列,他的下一位又從1開始報數,數到m的那個人又出列,以此類推,直到所有人出列位置,由此產生乙個出隊的編號序列。

提示

用乙個不帶頭結點的迴圈鍊錶來處理josephu問題:先構成乙個有n個結點的單迴圈鍊錶,然後由k結點起從1開始計數,記到m時,對應結點從鍊錶中刪除,然後在被從刪除的結點的下乙個結點開始又從1開始計數,直到最後乙個結點從鍊錶中刪除演算法結束。

構建環形鍊錶的思路

1.先建立乙個結點,讓first指向該節點,並形成佇列

2.後面我們沒建立乙個結點,就把該結點加入已有的環形佇列

遍歷環形鍊錶

1.先讓乙個輔助指標(變數)curboy,指向first結點

2.然後通過乙個while迴圈遍歷該環形鍊錶即可curboy.next == first結束

約瑟夫問題的解決思路

1.建立乙個輔助結點(變數)helper,事先應該指向環形鍊錶的最後乙個結點

補充:小孩報數前,想讓first和helper移動k-1次

2.當小孩報數的時候,讓first和helper同時移動m-1次

3.這時候就可以將first指向的小孩結點出圈

first = first.next;

helper.next = first;

原來first指向的結點就沒有任何引用嗎,就會被**。

實現**

package linkdelist;

public

class

josepfu

}//建立乙個環形的單向鍊錶

class

circlesinglelinkedlist

boy curboy = null;

//輔助指標,幫助構建環形鍊錶

//使用乙個for迴圈建立環形鍊錶

for(

int i =

1;i<=nums;i++

)else}}

//遍歷當前環形鍊錶

public

void

showboy()

//因為first不能動,仍然使用輔助指正完成遍歷

boy curboy = first;

while

(true

) curboy =curboy.

getnext()

;//curboy後移}}

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

/** *

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

* @param countno 表示數幾下

* @param nums 表示最初由多少小孩在在圈中

*/public

void

countboy

(int startno,

int countno,

int nums)

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

boy helper = first;

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

while

(true

) helper = helper.

getnext()

;}//小孩報數前,想讓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 < countno -

1;j++

)//這是first指向的結點就是出圈的結點

system.out.

printf

("小孩%d出圈\n"

,first.

getno()

);//將first指向小孩結點出圈

first = first.

getnext()

; helper.

setnext

(first);//

} system.out.

printf

("最後留在圈中小孩編號為%d"

,first.

getno()

);}}

//建立乙個boy類,表示乙個結點

資料結構之鍊錶 141 環形鍊錶

給定乙個鍊錶,判斷鍊錶中是否有環。如果鍊錶中有某個節點,可以通過連續跟蹤 next 指標再次到達,則鍊錶中存在環。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。注意 pos 不作為引數進行傳遞,僅僅是為了標識...

資料結構與演算法 環形鍊錶

約瑟夫 josephus 問題 約瑟夫問題 約瑟夫環 問題為 設編號為1,2,n的n個人圍坐在一起,約定編號為k 1 k n 的人 從1開始報數,數到m的那個人出列,他的下一列又從1開始報數,數到m的人出列,依次類推,直到所有人出列為止,由此產生乙個出隊編號的序列。方法 用乙個不帶頭結點的迴圈鍊錶來...

資料結構學習 鍊錶

將從下面4部分進行介紹 首先介紹鍊錶是什麼,然後介紹為什麼定義鍊錶,接著是鍊錶的分類,最後簡單介紹一下鍊錶結點的插入與刪除方法。首先,在介紹鍊錶之前,我們先介紹一下什麼是順序儲存結構。我們知道資料在計算機中的儲存就像貨物在倉庫中的儲存一樣,不但占用一定的空間,還要有乙個標示儲存位置的位址。計算機通過...