題目
據說著名猶太歷史學家 Josephus有過以下的故事:在羅馬人佔領喬塔帕特後,39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了一個自殺方式,41個人排成一個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下一個重新報數,直到剩下最後一個人時,那個人可以選擇自己的命運。這就是著名的約瑟夫問題。現在請用單向環形鏈表描述該結構並呈現整個自殺過程。
輸入:一個環形單向鏈表的頭節點head和報數的值m。
返回:最後生存下來的節點,且這個節點自己組成環形單向鏈表,其他的節點都刪掉。
思路
普通解法比較簡單,每刪除一個節點都需要遍歷m次,一共需要刪除n-1個節點,所以時間複雜度爲O(n*m)。
- 如果鏈表爲空或者節點數爲1,或者m的值小於1,則不用調整就直接返回。
- 在環形鏈表中遍歷節點,報數達到m時,刪除當前節點。
- 刪除節點後,剩下的節點繼續連成環狀,繼續報數,繼續刪除。
- 直到環形鏈表中只剩下一個節點,過程結束。
源碼
public class Node{
public int value;
public Node next;
public Node(int data){
this.value=data;
}
}
public Node josephusKill(Node head,int m){
if(head==null||head.next==head||m<1){
return head;
}
Node last=head;
while(last.next!=head){
last=last.next;
}
int count=0;
while(head!=last){
if(++count==m){
last.next=head.next;
}else{
last=last.next;
}
head=last.next;
}
return head;
}