約瑟夫(josephus)問題
約瑟夫問題(約瑟夫環)問題為:設編號為1,2,...,n的n個人圍坐在一起,約定編號為k(1<=k<=n)的人
從1開始報數,數到m的那個人出列,他的下一列又從1開始報數,數到m的人出列,依次類推,
直到所有人出列為止,由此產生乙個出隊編號的序列。
方法:
用乙個不帶頭結點的迴圈鍊錶來處理josephu問題:先構成乙個有n個結點的單迴圈鍊錶,然後由k結點起從1開始計數,
數到m時,對應結點從鍊錶中刪除,然後再從被刪除結的下乙個結點又從1開始計數,直到最後乙個結點從鍊錶中刪除演算法結束。
建立gril物件,每個物件就是乙個節點
class girl
public int getno()
public void setno(int no)
public girl getnext()
public void setnext(girl next)
}
構建單向環形鍊錶思路
1.先建立第乙個節點,讓讓first一直指向該節點
2.再建立乙個變數(指標)curgril,指向first節點
3.每建立乙個新節點,就讓curgril的next指向新節點,新節點的next指向first,curgril再指向新節點。
**如下:
class circlesinglelinkedlist
girl curgirl = null; //幫助構建環形鍊錶
//用for建立環形鍊錶
for (int i = 1; i <= nums; i++) else }}
遍歷環形鍊錶的思路
1.先讓乙個輔助指標(變數)curgril指向first節點
2.通過while迴圈遍歷該環形鍊錶,直到curgril.next == first時結束。
**://遍歷當前環形鍊錶
public void showgirl()
girl curgirl = first;
while (true)
curgirl = curgirl.getnext();}}
節點出圈思路
**:
/**
* @param startno 表示從第幾個位置開始數
* @param countnum 表示數幾下
* @param nums 表示最初有多少值在圈中
*/public void countgirl(int startno, int countnum, int nums)
girl helper = first;
while (true)
helper = helper.getnext();
}//先讓first和helper移動k-1次
for (int j = 0;j < startno - 1;j++)
//讓first和helper移動 m - 1次
while (true)
//讓first和helper同時移動countnum-1
for (int j = 0;j < countnum-1;j++)
//此時first指向的節點,就是要出圈的節點
system.out.printf("%d 出圈 \n",first.getno());
first = first.getnext();
helper.setnext(first);
}system.out.printf("最後在圈中的編號%d \n",helper.getno());
}
資料結構與演算法之環形鍊錶
單向環形鍊錶介紹 josephu問題 josephu 問題為 設編號為1,2,n的n個人圍坐一圈,約定編號為k 1 k n 的人從1開始報數,數到m 的那個人出列,它的下一位又從1開始報數,數到m的那個人又出列,依次類推,直到所有人出列為止,由此產生乙個出隊編號的序列。n 5,即有5個人 k 1,從...
資料結構與演算法 鍊錶 雙向鍊錶和環形鍊錶
1 雙向鍊錶和單向鍊錶之間有什麼區別?答 雙向鍊錶和單向鍊錶之間最大的區別就是其多了乙個指向前乙個節點的指標域。2 雙向鍊錶對比於單鏈表有什麼優點?答 3 雙向鍊錶功能實現時和單向鍊錶有何區別?答 具體功能實現大體上沒有區別,在遍歷節點和修改節點兩個功能上只需要將節點修改為雙向節點,根本不需要進行其...
資料結構 環形鍊錶
約瑟夫問題 josephu問題為 設編號為1,2,n的n個人圍坐一圈,約定編號為k 1 k n 的人從1開始報數,數到m的那個人出列,它的下一位又從1開始報數,數到m的那個人又出列,依次類推,直到所有人出列為止,由此產生 個出隊編號的序列。n 5即有五個人 k 1,從第乙個人開始 m 2,數兩下 出...