迴圈鍊錶解決約瑟夫環問題

2021-09-06 06:24:00 字數 1709 閱讀 8865

約瑟夫環問題可以簡單的使用陣列的方式實現,但是現在我使用迴圈鍊錶的方法來實現,因為上午看到一道面試題規定使用迴圈鍊錶解決約瑟夫環問題。

什麼是約瑟夫環?

這道面試題考察了迴圈鍊錶的「建立」,「遍歷」和「刪除」。

建立的迴圈鍊錶的結構圖:

解決約瑟夫環問題的過程

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...