1. 程式人生 > 其它 >環形連結串列和約瑟夫問題_韓順平聽課筆記

環形連結串列和約瑟夫問題_韓順平聽課筆記

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)結束迴圈,最後一個節點也出圈