單向環形鍊錶 約瑟夫問題

2021-10-08 05:38:17 字數 2167 閱讀 5279

如圖,鍊錶的最後乙個節點的next指向鍊錶的第乙個節點,形成乙個環形鍊錶。

josephu(約瑟夫、約瑟夫環)問題:

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

用乙個不帶頭節點的單向環形鍊錶來實現:

package linkedlist;

import org.junit.test;

/** * 單向環形鍊錶

* @author

* @create 2020-07-17 8:28 pm

*/public

class

singlecirclelinkedlist

}class

josephu

child curnode = null;

for(

int n =

1;n<=num;n++

)else}}

/** * 遍歷鍊錶的節點

*/public

void

showlinkedlist()

child cur = first;

while

(true

) cur = cur.

getnext()

;}}/**

* 計算小孩出隊的順序

* @param count 一共有幾個小孩

* @param startno 從編號為startno 的小孩開始從 1 報數

* @param step 數到 step 的這個小孩出隊,然後從他的後乙個小孩開始,繼續遊戲。

*/public

void

getoutorder

(int count,

int startno,

int step)

child helper = first;

//1.遍歷鍊錶,找到鍊錶的最後乙個節點,讓helper指向它。

while

(true

) helper = helper.

getnext()

;}//2.開始遍歷前,讓first 和 helper 節點分別向後移動 startno-1 次。讓first指向第乙個開始報數的人。

for(

int i =

1;i<=startno-

1;i++

)//3.開始報數,數到step的人出隊。迴圈整個鍊錶,直到遍歷完。

while

(true

)for

(int m =

1;m) system.out.

printf

("此次出隊的是學號為%d的學生\n"

,first.

getno()

);first = first.

getnext()

; helper.

setnext

(first);}

system.out.

printf

("最後出隊的是學號為%d的學生"

約瑟夫問題 單向環形鍊錶

約瑟夫問題的示意圖 josephu 問題 josephu 問題為 設編號為 1,2,n 的 n 個人圍坐一圈,約定編號為 k 1 k n 的人從 1 開始報數,數到 m 的那個人出列,它的下一位又從 1 開始報數,數到 m 的那個人又出列,依次類推,直到所有人出列為止,由此 產生乙個出隊編號的序列。...

單向環形鍊錶(約瑟夫問題)

josephu 問題 josephu問題為 設編號為1,2,n的n個人圍坐一圈,約定編號為k 1 k n 的人 從1開始報數,數到m的那個人出列,它的下一位又從1開始報數,數到m的那個人又出列,依次類推,直到所有人出列為止,由此產生 乙個出隊編號的序列。提示用乙個不帶頭結點的迴圈鍊錶來處理josep...

單向環形鍊錶 約瑟夫問題

單向環形鍊錶 約瑟夫問題 單向環形鍊錶 joseph 約瑟夫 約瑟夫環 問題 joseph 問題為 設編號為1,2,n 的n 個人圍坐一圈,約定編號為k 1 k n 的人從1 開始報數,數到m 的那個人出列,它的下一位又從1 開始報數,數到m 的那個人又出列,依次類推,直到所有人出列為止,由此產生乙...