約瑟夫環問題可以簡單的使用陣列的方式實現,但是現在我使用迴圈鍊錶的方法來實現,因為上午看到一道面試題規定使用迴圈鍊錶解決約瑟夫環問題。
什麼是約瑟夫環?
這道面試題考察了迴圈鍊錶的「建立」,「遍歷」和「刪除」。
建立的迴圈鍊錶的結構圖:
解決約瑟夫環問題的過程
c++實現**如下:
1測試結果:/**迴圈鍊錶解決約瑟夫環問題
2* 問題:約瑟夫環
3* 有編號從1到n的n個人坐成一圈報數,從第k個人開始報數,報到m的人出局,
4* 下一位再從1開始報數,如此持續,直止剩下一位為止,報告此人的編號x。
5* 輸入n,k,m,求出x。6*/
78 #include 9
using
namespace
std;
1011
struct
mynode
1214
15int
m_data;
16 mynode *m_pnext;
17};
1819
class
josephus
2027
28protected:29
void
createlist();
30void
outputlist();
3132
private
:33 mynode *m_phead;//
迴圈鍊錶的頭節點
34int m_n; //
鍊錶節點個數
35int m_k; //
第乙個報數人的序號
36int m_m; //
報數出局的數
37};
3839
void
josephus::createlist()
4053 cur->m_pnext =m_phead;
5455
int n=m_n;
56 p =m_phead;
57while (n--)
5862 cout <
6465
void
josephus::outputlist()
6675
while (m_n--) //
輸出鍊錶中所有的節點值
7683 mynode *p =cur;
84 cout << p->m_data << ","
;85 cur = cur->m_pnext; //
刪除節點的過程
86 pre->m_pnext =cur;
87delete p;
88 p=null;89}
90}9192
intmain()
93
迴圈鍊錶解決約瑟夫環問題
題目要求的約瑟夫環操作 編號是1,2,n的n個人按照順時針方向圍坐一圈,每個人只有乙個密碼 正整數 一開始任選乙個正整數作為報數上限值m,從第乙個仍開始順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向的下乙個人開始重新從1報數,如此下去,直到所有人...
迴圈鍊錶解決約瑟夫環問題
問題描述 假設有n個小孩按照序號1,2,n圍坐成一圈,從第乙個小孩開始報數,每次報到n的人退出,接著從下乙個人重新開始從1開始報數,下一次再報到n的人退出,求最後乙個留下的人 小孩的個數n,和報數的n由鍵盤輸入 輸出留下人的序號 乙個迴圈鍊錶都寫得除出了很多問題,改了半天才出來 include in...
用迴圈鍊錶解決約瑟夫環問題
題目見 解法 includeusing namespace std templatestruct node class nodelist void insert node newnode else node josephusremove int interval if head p head p n...