總結單向環形鍊錶,也就是單向迴圈鍊錶,也就是在單鏈表的基礎上,將尾節點的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的那個人又出列,依次類推,直到所有人出列為止,由此...