Josephu問題 單向環形列表

2021-10-24 08:59:23 字數 1922 閱讀 8945

josephu問題:

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

根據問題的描述,我們可以使用乙個沒有頭節點的單向環形鍊錶來實現解決這個josephu問題。

首先來建立乙個節點

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...