環形連結串列和約瑟夫問題_韓順平聽課筆記
阿新 • • 發佈:2021-09-04
27.環形連結串列介紹和約瑟夫問題
單向環形連結串列應用場景:約瑟夫問題
單項環形列表案例:
約瑟夫問題分析:
- 使用單項環形連結串列完成約瑟夫問題(陣列取模也可以完成 )
- 數到n的節點出列,下一個節點繼續報數
- 最後只剩一個節點時依舊是單項環形連結串列,它的next指向自己,且它會最後一個出列
28.約瑟夫問題分析圖解和實現1,構建,新增元素,遍歷
- first指標指向第一個節點
單項環形連結串列的構建和遍歷思路:
疑問:建立時為什仫需要兩個輔助變數:一個curBoy指向當前節點,另一個boy指向要加入連結串列的節點curBoy.next=boy,boy.next=first,curBoy=boy,
- 建立一個boy類,表示一個節點
- 建立一個環形單向連結串列class CircleSingleLinkedList,內部新增一個first節點
- 遍歷當前環形連結串列方法
- 判斷當前連結串列是否為空,if(first==null):first初始值設定為null,連結串列為空
29.約瑟夫問題分析圖解和實現,出列
出列實現難點思考:
- 節點出列後,如何將當前節點的上一個節點與下一個節點相連
- 為了解決上一個問題,如何設定對節點是否出佇列的判斷,是否需要提前對下一個節點是否出佇列進行判斷(連結串列單向,不能往回找)
- 特殊情況:從第一個節點就開始出佇列又如何實現,如何將末尾節點node:node.next==first與下一個節點first.next相連
出列實現思路分析:
- 一個輔助節點helper指向連結串列的最後一個節點,helper.next==first
- 移動時,helper和first同時移動,移動m-1次
- 將當前first指向的節點出列
出列具體實現問題:
- helper怎麼實現,需要先遍歷一遍連結串列,取到最後一個節點?
- 出圈前helper和first先移動k-1次,移動到報數小孩的位置(實現了helper後才做)
- 迴圈出圈,當圈中只剩一個節點時(helper==first)結束迴圈,最後一個節點也出圈