鏈表問題6——環形單鏈表的約瑟夫問題(初階)

題目

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

輸入:一個環形單向鏈表的頭節點head和報數的值m。

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


思路

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

  1. 如果鏈表爲空或者節點數爲1,或者m的值小於1,則不用調整就直接返回。
  2. 在環形鏈表中遍歷節點,報數達到m時,刪除當前節點。
  3. 刪除節點後,剩下的節點繼續連成環狀,繼續報數,繼續刪除。
  4. 直到環形鏈表中只剩下一個節點,過程結束。

源碼

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

 

發佈了57 篇原創文章 · 獲贊 34 · 訪問量 6495
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章