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 從...