環型單向鍊錶 約瑟夫問題

2021-10-06 01:39:09 字數 2156 閱讀 8238

josephu問 題為:設編號為1, 2, … n的n個人圍坐- -圈,約定編號為k (1<=k<=n) 的人從1開始報數,數到

m的那個人出列,它的下一位又從1開始報數,數到m的那個人又出列,依次類推,直到所有人出列為止,由此

產生-乙個出隊編號的序列。

用乙個不帶頭結點的迴圈鍊錶來處理josephu問題:

​ 先構成-乙個有n個結點的單迴圈鍊錶,然後由k結點起從1開始計數,計到m時,對應結點從鍊錶中刪除,然後再從被刪除結點的下乙個結點又從1開始計數,直到最後乙個節點從鍊錶中刪除,演算法結束。

* 環型單鏈表

* * @author 98578

*/public

class

circlesinglelinkedlist

//輔助節點

node cur = null;

for(

int i =

1; i <= num; i++

)else}}

/** * 遍歷鍊錶

*/public

void

list()

node temp = first;

while

(true

) temp = temp.

getnext()

;}}/**

* 約瑟夫問題

** @param startno 開始的編號

* @param countnum 數到第countnum個出圈

* @param nums 總人數

*/public

void

countnode

(int startno,

int countnum,

int nums)

//定義輔助節點,位於環型單向鍊錶的最後乙個節點,為出圈刪除做準備。

node temp = first;

//1.先讓temp位於環型單向鍊錶的最後

for(

int i =

0; i < nums -

1; i++

)//2.讓temp與first分別移動 startno-1個

for(

int i =

0; i < startno -

1; i++

)//3.開始報數出圈

while

(true

)//讓temp與first分別移動 countnum-1個

for(

int i =

0; i < countnum -

1; i++

) system.out.

println

(first +

"出圈");

first = first.

getnext()

; temp.

setnext

(first);}

//輸出最後保留的人

system.out.

println

("留到最後的節點是:"

+ first);}

}

public

class

node

public

intgetno()

public

void

setno

(int no)

public node getnext()

public

void

setnext

(node next)

@override

public string tostring()

}

/**

* 約瑟夫

* @author 98578

*/public

class

josepfu

}

單向迴圈鍊錶 約瑟夫環

寫個約瑟夫環,檢驗一下自己的學習狀況.include define elemtype int typedef struct lnodesqlist void initlist sqlist l,elemtype n void round sqlist l,int m,int n int main v...

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

建立人 wdl 建立時間 2021 3 19 描述 public class josepfu 建立乙個環形的單向鍊錶 class circlesinglelinkedlist boy curboy null 輔助指標,幫助我們構建環形鍊錶 使用for來建立我們的環形鍊錶 for int i 1 i ...

約瑟夫環問題(順序表和單向鍊錶)

問題描述 設有n個人站成一圈,每個人有不同的編號i 1 i n 即i 從編號為1的人開始按順時針方向 1,2,3,m 迴圈報數,數到m的人出列。然後從出列者的下乙個人開始重新報數,數到m的人又出列,如此重複進行,直到n個人都出列為止 解決思路 先對儲存人員資訊資料結構進行初始化,初始遍歷節點為1 從...