環形單鏈表的約瑟夫問題

2022-09-10 09:33:07 字數 1251 閱讀 1930

題目:環形單鏈表的約瑟夫問題

《程式設計師**面試指南》第17題 p50 難度:士★☆☆☆

本題普通解法很簡單,只需要不斷的遍歷環形單鏈表即可,報數為m的節點將其從鍊錶中去除,直到剩下最後乙個節點。

另外注意一下異常情況,head==null或者只有1個節點或者報數m<1則直接返回

牛客題解**如下:

import j**a.io.bufferedreader;

import j**a.io.ioexception;

import j**a.io.inputstreamreader;

public class main

}

public static node josephuskill(node head, int m)

node last = head;

while (last.next != head)

int count = 0;

while (head != last) else

head = last.next;

}return head;

}public static void main(string args) throws ioexception

cur.next = head;

head = josephuskill(head, m);

system.out.println(head.value);

}}

題目:環形單鏈表的約瑟夫問題(高階)

《程式設計師**面試指南》第17題 p51 難度:校★★★☆

普通解法的時間複雜度為o(n×m),高階問題要求時間複雜度達到o(n)

看了書上的思路,大致概括一下:

首先遍歷環形單鏈表,第乙個報數m的節點將其去除,剩下的節點重新編號。此時新老編號存在一定的對應關係

然後再對剩下的節點再執行以上操作,直到只剩最後乙個節點。

**實現是使用遞迴,如下:

public int getlive(int i, int m) 

return (getlive(i-1, m) + m-1) % i + 1;

詳細原理參照書p51-55,純數學問題,略複雜且不好描述。

環形單鏈表約瑟夫問題

乙個環形單鏈表,從頭結點開始向後,指標每移動乙個結點,就計數加1,當數到第m個節點時,就把該結點刪除,然後繼續從下乙個節點開始從1計數,迴圈往復,直到環形單鏈表中只剩下了乙個結點,返回該結點。思路 當鍊表為空或者鍊錶只有乙個節點或者m 1時,不做處理,直接返回原鍊錶即可。if head null h...

環形單鏈表的約瑟夫問題

輸入 乙個環形單鏈表的頭結點head和報數的值m。返回 最後生存下來的節點,且這個節點自己組成環形單向鍊錶,其他節點都刪掉。高階 如果鍊錶節點數為n,想在時間複雜度o n 時完成原問題的要求,該如何實現?public class josephuskill1 public node josephusk...

環形單鏈表的約瑟夫問題

題目 約瑟夫環 約瑟夫問題 是乙個數學的應用問題 已知n個人 以編號1,2,3 n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌只剩乙個人。解題思路 1 如果鍊錶為空,或者鍊錶節點數為1,retu...