鍊錶問題6 環形單鏈表的約瑟夫問題 初階

2021-10-01 22:49:27 字數 784 閱讀 9326

據說著名猶太歷史學家 josephus有過以下的故事:在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,直到剩下最後乙個人時,那個人可以選擇自己的命運。這就是著名的約瑟夫問題。現在請用單向環形鍊錶描述該結構並呈現整個自殺過程。

輸入:乙個環形單向鍊錶的頭節點head和報數的值m。

返回:最後生存下來的節點,且這個節點自己組成環形單向鍊錶,其他的節點都刪掉。

普通解法比較簡單,每刪除乙個節點都需要遍歷m次,一共需要刪除n-1個節點,所以時間複雜度為o(n*m)。

如果鍊錶為空或者節點數為1,或者m的值小於1,則不用調整就直接返回。

在環形鍊錶中遍歷節點,報數達到m時,刪除當前節點。

刪除節點後,剩下的節點繼續連成環狀,繼續報數,繼續刪除。

直到環形鍊錶中只剩下乙個節點,過程結束。

public class node 

}public 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;

}

五 環形鍊錶和約瑟夫問題

約瑟夫問題 設編號為1,2,n的n個人圍坐一圈,約定編號為k 1 k n 的人從1開始報數,數到m 的那個人出列,它的下一位又從1開始報數,數到m的那個人又出列,依次類推,直到所有人出列為止,由此產生乙個出隊編號的序列。例如編號為12345的環形鍊錶,從1開始,則出隊編號為 2 4 1 5 3.pa...

環形鍊錶與約瑟夫環問題

思路 建立乙個環形的單向鍊錶 class circlesinglelinkedlist boy curboy null 輔助指標,幫助構建環形鍊錶 使用for來建立我們的環形鍊錶 for int i 1 i nums i else 遍歷當前的環形鍊錶 public void showboy 因為fi...

環形單鏈表的約瑟夫問題

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