單項迴圈鍊錶經典問題 問題一 約瑟夫問題

2021-09-27 06:08:12 字數 1792 閱讀 8197

在羅馬人占領橋塔帕特後,39個猶太人與josephus以及他的朋友躲在乙個洞中,39個猶太人決定寧願四也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第乙個人開始報數,每報數到第3個人該人必須自殺,然後再由下乙個重新報數,直到所有人都自殺身亡為止。

然而josephus和他的朋友並不想遵從,josephus要它的朋友先假裝遵從,他將朋友與自己安排在了第16個與第31個位置,於是逃過了這場死亡遊戲。

然後以此類推,最後剩下的就是13和20(41個人的話剩下的就是16和31),所有我們可以利用單向迴圈鍊錶來解決這個問題,通過刪除的方法,判斷出最後剩下的兩個元素,即可解決這個問題,目前還不太了解單向迴圈鍊錶的小可愛們可以參照我之前所寫一篇關於單向迴圈鍊錶的文章,可以作為參考哦!

所以我們定義了兩個指標,分別指向頭結點和尾結點,另外定義乙個指標,因為每數到3的那個人gameover,那麼只需要這個指標每次走到他前面那個元素(走一次),然後將要刪除掉的節點的下一跳給指標所指的節點的下一跳,然後指標後移,依次迴圈,但是在迴圈的過程中當要刪除的是尾結點的時候,我們不需要再和鍊錶一樣從頭開始遍歷找到刪除的上乙個結點,因為我們現在定義的指標就是指向要刪除的結點的上乙個結點,所以只需要將指標所指的結點的下一跳指向頭結點,尾指標移動到這個結點(或者先移動尾指標至要指標所指向的結點,再將尾結點的下一跳指向頭結點),要刪除的是頭結點的時候,頭指標後移,尾指標指向當前頭結點。

但是在我們這個圖中20是不會被刪除的,因為最終留下了的就是13和20,所以尾結點是沒有被刪除的可能,但是我們還是還模擬一下尾結點被刪除的情況,也就是當指標p指向19的時候,我們要刪除尾指標,我們要將20的下一跳給19,然後尾指標指向19。

head=null; //頭指標為空

rear=null; //尾指標

size=0; //有效元素個數

for(integer i=1;i<=number;i++)

linkedlistlist=new linkedlist();//建立新的linkedlist物件

node p=head; //判斷要刪除元素的指標

while(true) {

for(int i=0;i當然,我們這個問題的解決是建立在迴圈鍊錶的基礎上的,所以大家還是要很了解迴圈鍊錶滴!

下面給出測試類,測試方法也是寫在迴圈鍊錶的測試類裡面的。

linkedlistout=loop.jossephusloop(41, 3);

system.out.println(out);

執行結果:

經典鍊錶問題

題目描述 在單鏈表中輸出倒數第k個節點 要求 如果鍊錶長為n,時間複雜度為o n 額外空間複雜度達到o 1 思路 當我們用num來表示鍊錶中節點個數,當我們輸出節點的時候會出現三種情況 不存在第k個節點,此時返回空 num第k個節點就是第乙個節點,操作較容易 num k 第k個節點在鍊錶中 num ...

迴圈鍊錶練習 一 約瑟夫環

約瑟夫環問題,是乙個經典的迴圈鍊錶問題,題意是 已知 n 個人 分別用編號 1,2,3,n 表示 圍坐在一張圓桌周圍,從編號為 k 的人開始順時針報數,數到 m 的那個人出列 他的下乙個人又從 1 開始,還是順時針開始報數,數到 m 的那個人又出列 依次重複下去,直到圓桌上剩餘乙個人。如圖所示,假設...

演算法 關於約塞夫問題,單迴圈鍊錶

借鑑了別人的 在經過自己的理解 設有n個人圍成一圈 編號從1到n 約定從編號為k 1 k n 的人從1開始報數 數到 m 的那個人被淘汰 接著下乙個人重新從1開始報數 數到 m 再淘汰一人 如此反覆 直至剩下最後乙個人為止 我們可以知道約瑟夫問題是乙個不斷迴圈而且資料不斷減少的過程 使用單向迴圈鍊錶...