josephu 問題
josephu問題為:設編號為1,2, … n的n個人圍坐一圈,約定編號為k (1<=k<=n) 的人
從1開始報數,數到m的那個人出列,它的下一位又從1開始報數,數到m的那個人又出列,依次類推,直到所有人出列為止,由此產生-乙個出隊編號的序列。
提示用乙個不帶頭結點的迴圈鍊錶來處理josephu問題:先構成乙個有n個結點的單迴圈鍊錶,
然後由k結點起從1開始計數,計到m時,對應結點從鍊錶中刪除,然後再從被刪除結點的下乙個結點又從1開始計數,直到最後乙個結點從鍊錶中刪除演算法結束。
package com.linkedlist;
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()
;}}//根據使用者的輸入 計算出小孩出圈順序
//startno 表示從第幾個小孩開始數
//countnum 數幾次
//nums 最初有多少個小孩在圈中
public
void
countboy
(int startno,
int countnum,
int nums)
//建立輔助指標 幫助小孩出圈
boy helper =first;
while
(true
)else
}//小孩報數前 先讓first與helper移動k-1次
for(
int j=
0;j1;j++
)//出圈 迴圈操作 直到圈中只有乙個節點
while
(true
)else
//此時first為要出圈的小孩
system.out.
println
("出圈小孩編號"
+first.
getno()
);//將first節點出圈
first = first.
getnext()
; helper.
setnext
(first);}
} system.out.
println
("最後僅有的小孩編號"
+first.
getno()
);}}
//先建立乙個boy類 表示乙個節點
class
boypublic
intgetno()
public boy getnext()
public
void
setnext
(boy next)
public
void
setno
(int no)
}
約瑟夫問題 單向環形鍊錶
約瑟夫問題的示意圖 josephu 問題 josephu 問題為 設編號為 1,2,n 的 n 個人圍坐一圈,約定編號為 k 1 k n 的人從 1 開始報數,數到 m 的那個人出列,它的下一位又從 1 開始報數,數到 m 的那個人又出列,依次類推,直到所有人出列為止,由此 產生乙個出隊編號的序列。...
單向環形鍊錶 約瑟夫問題
如圖,鍊錶的最後乙個節點的next指向鍊錶的第乙個節點,形成乙個環形鍊錶。josephu 約瑟夫 約瑟夫環 問題 設編號為1,2,3 n的 n個人坐成一圈,編號為k 1 k n 的人從1開始報數,數到m的那個人出列,他的下一位繼續從1開始報數,數到m的那個人又出列,依次類推,直到所有人出列為止,由此...
單向環形鍊錶 約瑟夫問題
單向環形鍊錶 約瑟夫問題 單向環形鍊錶 joseph 約瑟夫 約瑟夫環 問題 joseph 問題為 設編號為1,2,n 的n 個人圍坐一圈,約定編號為k 1 k n 的人從1 開始報數,數到m 的那個人出列,它的下一位又從1 開始報數,數到m 的那個人又出列,依次類推,直到所有人出列為止,由此產生乙...