劍指offer 單鏈表實現約瑟夫環

2021-08-25 14:41:49 字數 1596 閱讀 6783

約瑟夫環(約瑟夫問題)是乙個數學的應用問題:已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下乙個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。通常解決這類問題時我們把編號從0~n-1,最後結果+1即為原問題的解。

下面是我畫的乙個對於一共有8個結點的環,每次報到3的時候就刪除這個結點的展示圖:

綜上步驟:

第一步:從1開始報數為3的時候就刪除3號結點

第二步:從4號結點開始報數,當為3的時候刪除6號結點;

第三步:從7號結點開始報數,當為3的時候刪除1號結點;

第四步:從2號結點開始報數,當為3的時候刪除5號結點;

第五步:從7號結點開始報數,當為3的時候刪除2號結點;

第六步:從4號元素開始報數,當為3的時候刪除8號結點;

第七步:又從4號開始報數,當為3的時候刪除4號結點,此時鍊錶中只有乙個7號結點,所以最後的結點就是7號結點;

//約瑟夫環問題:列印依次被刪的序列號並保留最後乙個

void josephuscycle(pnode* pplist,size_t k)

printf("刪除的是:%d\n",pcur->

data);

pdel = pcur->pnext;

pcur->

data

= pdel->

data;

pcur->pnext = pdel->pnext;

free(pdel);

pdel =

null;

}printf("最後倖存的是:%d\n", pcur->

data);

}//尾插 (1.檢查鍊錶是否存在

// 2.存在為空直接插入

// 3.存在不為空先找到最後節點)

void pushback(plist* pplist, datatype d)

//為空直接插入

if (null

==*pplist)

//存在不為空找到最後節點

else

pcur->pnext = pnewnode;

}}//查詢

pnode find(plist pplist, datatype d)

pcur = pcur->pnext;

}return

null;

}//測試

void testjosephuscycle()

printlist(plist);

//構成環

find(plist, 8)->pnext = plist;

josephuscycle(&plist,3);

}

結語:
只有自己知道自己的付出的多少,望星耀星空,花艷四方!

劍指Offer 翻轉單鏈表

定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。樣例輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null有兩種方法。一種直觀的方法是使用棧,利用棧先進後出的特性。將節點的值全部壓入棧,出棧的時候需要建立新的節點,連成鍊錶。這裡注意不要直接把鍊錶中的各個節點丟...

劍指offer 約瑟夫環

提交 nowcode 其實是乙個一步步從最後只剩乙個人到還原第一次n個人編號的過程,而不是一步步把每次出局的人找出來,其實過程是未知的 n個小朋友們圍成乙個大圈,編號0 n 1 隨機指定乙個數m,讓編號為0的小朋友開始報數。每次喊到m 1的那個小朋友要出列唱歌,並且不再回到圈中 從剛出列的下乙個小朋...

劍指offer 約瑟夫環

每年六一兒童節,牛客都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此。hf作為牛客的資深元老,自然也準備了一些小遊戲。其中,有個遊戲是這樣的 首先,讓小朋友們圍成乙個大圈。然後,他隨機指定乙個數m,讓編號為0的小朋友開始報數。每次喊到m 1的那個小朋友要出列唱首歌,然後可以在禮品箱中任意的挑選禮...