如圖,鍊錶的最後乙個節點的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 的那個人又出列,依次類推,直到所有人出列為止,由此產生乙...