josephu問題:根據問題的描述,我們可以使用乙個沒有頭節點的單向環形鍊錶來實現解決這個josephu問題。設編號為1,2,…n的n個人圍坐一圈,約定編號為k(1<=k<=n)的人從1開始報數,數到m的那個人出列,它的下一位又從1開始報數,數到m的那個人又出列,依次類推,直到所有人出列為止,由此產生乙個出隊編號的序列。
首先來建立乙個節點
class
node
public
intgetnumber()
public
void
setnumber
(int number)
public node getnext()
public
void
setnext
(node next)
}
其次來建立乙個環形鍊錶類,並編寫初始化方法來形成環
其中我們會建立輔助節點,來幫我們更好的操作鍊錶。
class
circlelinkedlist
// 用來輔助初始化的節點
node curnode = null;
for(
int i =
1; i <= no; i++
)else}}
}
遍歷鍊錶的方法
// 遍歷當前鍊錶
public
void
show()
node curnode = first;
// 使用while迴圈來遍歷節點,當curnode節點的下乙個為first節點時,遍歷結束
while
(true
) curnode = curnode.
getnext()
;}}
根據輸入來計算出圈順序,然後出圈
/**
** @param start 從start這個編號的節點開始
* @param count 中間經過count個節點後出圈
* @param nums 總的節點數
*/public
void
outnode
(int start,
int count,
int nums)
// 建立乙個指向最後乙個節點的輔助節點,用來幫助我們對鍊錶的操作
node end = first;
// 通過遍歷使end指向最後的節點
while
(true
)// 從第幾個節點開始就讓first向前指向那個節點,所以要進行start - 1次的操作
for(
int i =
0; i < start -
1; i++
)while
(true
) system.out.
println
(first.
getnumber()
+"號節點已出圈");
// 去掉出圈的節點,讓剩下的節點繼續連線成環
first = first.
getnext()
; end.
setnext
(first);}
system.out.
println
("最後還有 "
+ first.
getnumber()
+"號節點還在圈內");
}
通過main()方法來檢驗一下
public
class
josephu
}
約瑟夫 環 問題 Josephu 單向環形鍊錶
建立人 wdl 建立時間 2021 3 19 描述 public class josepfu 建立乙個環形的單向鍊錶 class circlesinglelinkedlist boy curboy null 輔助指標,幫助我們構建環形鍊錶 使用for來建立我們的環形鍊錶 for int i 1 i ...
約瑟夫問題 單向環形鍊錶
約瑟夫問題的示意圖 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...