約瑟夫環: 一個殺人遊戲演算法
迴圈連結串列

把連結串列的兩頭連線,使其成為了一個環狀連結串列,通常稱為迴圈連結串列。
和它名字的表意一樣,只需要將表中最後一個節點的指標指向頭結點,連結串列就能成環兒,如圖1 所示。

圖1 迴圈連結串列
需要注意的是,雖然迴圈連結串列成環狀,但本質上還是連結串列,因此在迴圈連結串列中,依然能夠找到頭指標和首元節點等。迴圈連結串列和普通連結串列相比,唯一的不同就是迴圈連結串列首尾相連,其他都完全一樣。
迴圈連結串列實現約瑟夫環

行文不易,新手上路,多多關注,這真的對我很重要,私信更有驚喜
約瑟夫環問題,是一個經典的迴圈連結串列問題,題意是:已知 n 個人(分別用編號 1,2,3,…,n 表示)圍坐在一張圓桌周圍,從編號為 k 的人開始順時針報數,數到 m 的那個人出列;他的下一個人又從 1 開始,還是順時針開始報數,數到 m 的那個人又出列;依次重複下去,直到圓桌上剩餘一個人。
如圖 2 所示,假設此時圓周周圍有 5 個人,要求從編號為 3 的人開始順時針數數,數到 2 的那個人出列:

圖 2 迴圈連結串列實現約瑟夫環
出列順序依次為:
編號為 3 的人開始數 1,然後 4 數 2,所以 4 先出列;
4 出列後,從 5 開始數 1,1 數 2,所以 1 出列;
1 出列後,從 2 開始數 1,3 數 2,所以 3 出列;
3 出列後,從 5 開始數 1,2 數 2,所以 2 出列;
最後只剩下 5 自己,所以 5 勝出。
約瑟夫環問題有多種變形,比如順時針轉改為逆時針等,雖然問題的細節有多種變數,但解決問題的中心思想是一樣的,即使用迴圈連結串列。
通過以上的分析,我們可以嘗試編寫 C 語言程式碼,完整程式碼如下所示:
開啟UC瀏覽器 檢視更多精彩圖片


行文不易,新手上路,多多關注,這真的對我很重要,私信更有驚喜