單項環形鍊錶介紹和約瑟夫問題

2021-09-24 04:10:18 字數 2335 閱讀 1386

josephu 問題為:設編號為1,2,… n的n個人圍坐一圈,約定編號為k(1<=k<=n)的人從1開始報數,數到m 的那個人出列,它的下一位又從1開始報數,數到m的那個人又出列,依次類推,直到所有人出列為止,由此產生乙個出隊編號的序列。

先建立第乙個節點, 讓 first 指向該節點,並形成環形

後面當我們每建立乙個新的節點,就把該節點,加入到已有的環形鍊錶中即可.

遍歷環形鍊錶

先讓乙個輔助指標(變數) curboy,指向first節點

然後通過乙個while迴圈遍歷 該環形鍊錶即可 curboy.next == first 結束

n = 5 , 即有5個人

k = 1, 從第乙個人開始報數

m = 2, 數2下

需求建立乙個輔助指標(變數) helper , 事先應該指向環形鍊錶的最後這個節點.

補充: 小孩報數前,先讓 first 和 helper 移動 k - 1次

當小孩報數時,讓first 和 helper 指標同時 的移動 m - 1 次

這時就可以將first 指向的小孩節點 出圈

first = first .next

helper.next = first

原來first 指向的節點就沒有任何引用,就會被**

出圈的順序

2->4->1->5->3

package cn.smallmartial.linkedlist;

/** * @author smallmartial

* @date 2019/6/4

* @email [email protected]

*/public class josephu

}//建立乙個環形單鏈表

class circlesinglelinkedlist

boy curboy = null;//輔助指標,幫助構建環形鍊錶

for (int i = 1; i <= nums; i++) else }}

//遍歷當前鍊錶

public void showboy()

boy curboy = first;

while (true)

curboy = curboy.getnext();//後移}}

//根據使用者的輸入,計算小孩出圈的順序

/***

* @param startno //表示從第幾個小孩開始數數

* @param countnum //表示數幾下

* @param nums //表示最初有多少小孩在圈中

*/public void countboy(int startno, int countnum,int nums)

//建立輔助指標

boy helper = first;

while (true)

helper = helper.getnext();

}//小孩報數之前,先讓firsr和helper 移動 k-1次

for (int j = 0; j < startno - 1; j++)

while (true)

for (int i = 0; i < countnum - 1; i++)

system.out.println("小孩出圈:"+first.getno());

first = first.getnext();

helper.setnext(first);

}system.out.println("最後留在圈中的小孩:"+first.getno());

}}//建立乙個boy類

單向環形鍊錶和約瑟夫問題

當n 5 m 2,k 1時出佇列的順序 2 4 1 5 3 乙個節點也能形成環鏈 構建乙個單向的環形鍊錶思路 1.先建立第乙個節點,讓first指向該節點,並形成環形.2.後面當我們每建立乙個新的節點,就把該節點,加入到已有的環形鍊錶中即可.public void addnode int nums ...

1 6 單向環形鍊錶和約瑟夫問題

約瑟夫問題 實現思路 實現 public class circlesinglelinkedlistdemo 單向環形鍊錶類 class circlesinglelinkedlis children current null 尾指標 指向下乙個節點為頭節點的節點 方便插入,不需要每次都遍歷 for i...

五 環形鍊錶和約瑟夫問題

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