單向環形鍊錶與約瑟夫問題

2021-10-06 01:28:35 字數 2130 閱讀 2470

總結單向環形鍊錶,也就是單向迴圈鍊錶,也就是在單鏈表的基礎上,將尾節點的next指標指回頭節點,形成乙個環

和單鏈表一樣的實現,沒什麼好說的額

/**

* 鍊錶節點

*/class

node2

public

intgetno()

public

void

setno

(int no)

public node2 getnext()

public

void

setnext

(node2 next)

}

這邊只寫了鍊錶的快速初始化遍歷方法,基本增刪改查和單鏈表也差不多

/**

* 單向環形鍊錶

*/class

circlesinglelinkedlist

//輔助節點,指向最後的節點

node2 curnode = null;

for(

int i =

1; i <= num; i++

)else}}

/** * 遍歷鍊錶

*/public

void

show()

node2 curnode = head;

while

(true

) curnode = curnode.

getnext()

;}}}

假設有乙個節點數量為5的單向環形鍊錶,並使用helper輔助節點進行約瑟夫問題的推導

/**

* 約瑟夫問題

* @param startno 第幾個開始

* @param count 鍊錶中的節點個數

* @param nums 朝乙個方向數到幾的節點出圈

*/public

void

joseph

(int startno,

int count,

int nums)

//建立helper輔助節點,指向「 以startno節點為head的鍊錶的最後乙個節點 」

node2 helper = head;

while

(true

) helper = helper.

getnext()

;}//將helper和head移動到相應startno的位置

for(

int i =

0; i < startno -

1; i++

)while

(true

)for

(int i =

0; i < nums -

1; i++

) system.out.

println

("出圈節點"

+ head.

getno()

);head = head.

getnext()

; helper.

setnext

(head);}

}

public

static

void

main

(string[

] args)

節點1

節點2節點3

節點4節點5

----

----

----

----

----

----

--出圈節點2

出圈節點4

出圈節點1

出圈節點5

最後出圈節點3

結果符合預期

以上是比較簡單的約瑟夫實現,時間複雜度是o(nm),太高了,網上有大佬的更吊的實現,可惜看不懂哈哈哈哈

約瑟夫問題 單向環形鍊錶

約瑟夫問題的示意圖 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...

單向環形鍊錶 約瑟夫問題

如圖,鍊錶的最後乙個節點的next指向鍊錶的第乙個節點,形成乙個環形鍊錶。josephu 約瑟夫 約瑟夫環 問題 設編號為1,2,3 n的 n個人坐成一圈,編號為k 1 k n 的人從1開始報數,數到m的那個人出列,他的下一位繼續從1開始報數,數到m的那個人又出列,依次類推,直到所有人出列為止,由此...