演算法 約瑟夫環的簡易實現

2021-06-22 17:08:40 字數 858 閱讀 5129

題目:使用者輸入m,n值,從1至n開始順序迴圈數數,每數到m輸出該數值,直至全部輸出。

分析:該題目的通用解法是利用迴圈鍊錶,當然也可以利用迴圈陣列。易於擴充套件的做法是,定義迴圈鍊錶的資料結構,並實現迴圈鍊錶的基本操作,利用這些基本操作如插入、刪除、初始化、構建鍊錶等操作;簡易的實現方法則是僅適合該題目的解法。

採用無頭的迴圈鍊錶,如果有頭,則需要在每次遍歷中跳過頭節點。因為採用了無頭的鍊錶,因此在插入或者刪除時,需要針對頭節點特殊處理:

1、插入時,鍊錶為空,則當前待插入的節點為煉表頭;

2、刪除時,由於題目只要求輸出刪除節點,鍊錶又是迴圈鍊錶,因此可以不考慮刪除節點為頭節點的情況。不過,為了刪除當前節點,我們需要儲存其前驅結點的指標。

**如下:

#include #include "joseph.h"

using namespace std;

void joseph()

else

}node prev = current; //此處有些取巧,我們從煉表頭開始遍歷鍊錶,其前驅應為表尾,鍊錶構建完成過後current指標恰好為表尾,因此先儲存該指標

current = head; //再給current賦值,指向表頭

int cnt = 1; //初始化計數器,當前節點計數器為1

while (current != current->next) else

}cout << current->data << endl; //輸出鍊錶最後乙個元素

delete current;

}

約瑟夫環演算法

約瑟夫環是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。2b求解 private void myjosf int teamle...

演算法 約瑟夫環

已知n個人 以編號1,2,3 n分別表示 圍坐在一張圓桌周圍 使用 list 來模擬環結構,不被淘汰則將其加入到 list 尾部,淘汰的直接移除。需注意,以編號 k 為第乙個報數的人,需要調整其在報數正式開啟前到 list 的頭部。param n 人的總數 param k 開始報數的序號,1 k n...

約瑟夫環的O n 演算法

問題描述 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為1的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列,求最後乙個出列人的編號。為了討論方便,先把問題稍微改變一下,並不影響原意 問題描述 n個人...