約瑟夫問題是個著名的問題:n個人圍成一圈,第乙個人從1開始報數,報m的將被殺掉,下乙個人接著從1開始報。 如此反覆,最後剩下乙個,求最後的勝利者。 例如只有三個人,把他們叫做a、b、c,他們圍成一圈,從a開始報數,假設報2的人被殺掉。
約瑟夫問題其實就乙個迴圈鍊錶問題
先建立節點類
public
class
node
public
intgetno()
public
void
setno
(int no)
public node getnext()
public
void
setnext
(node next)
}
加入節點操作
使用乙個輔助節點指向當前鍊錶的最後乙個節點,加入節點的操作就是將當前節點的next域指向加入的節點,將加入節點的next域指向第乙個節點,同時要將輔助節點向後移乙個位置
package com.ht.circlelinkedlist;
/** * @author ht
* @create 2020-10-29 18:59
* @description
*/public
class
circlesinglelinkedlist
node curnode = null;
for(
int i =
1; i <= nums; i++
)else
}}
遍歷鍊錶就是使用輔助節點進行遍歷,和普通鍊錶的遍歷是一樣的
//遍歷鍊錶
public
void
shownode()
node curnode = first;
while
(true
) curnode = curnode.
getnext();}}
約瑟夫問題的解決
**中有注釋,夠看
/**
** @param startno 開始報數
* @param countnum 數幾下
* @param nums 總數
*/public
void
countnode
(int startno,
int countnum,
int nums)
//建立輔助指標,幫助出圈
node helper = first;
//事先讓輔助節點指向最後乙個節點
while
(true
) helper = helper.
getnext()
;}//報數前,讓first和helper移到相應節點
for(
int j =
0; j < startno -
1; j++
)while
(true
)//讓first和helper移動countnum - 1
for(
int i =
0; i < countnum -
1; i++
) system.out.
println
("節點"
+ first.
getno()
+"出圈");
first = first.
getnext()
; helper.
setnext
(first);}
system.out.
println
("最後留在圈中的節點是"
+ first.
getno()
);}}
迴圈鍊錶 約瑟夫問題
設編號分別為 1,2,n的n個人圍坐一圈。約定序號為k 1 k n 的人從1開始計數,數到m的那個人出列,他的下一位又從1開始計數,數到m的那個人又出列,依次類推,直到所有人出列為止。演算法思路 1 先建立乙個有n個結點的單迴圈鍊錶,編號從1到n,代表n個人。2 找到第k個結點,即第乙個開始報數的人...
(迴圈鍊錶)約瑟夫問題
time limit 1000 ms memory limit 65536 kib submit statistic n個人想玩殘酷的死亡遊戲,遊戲規則如下 n個人進行編號,分別從1到n,排成乙個圈,順時針從1開始數到m,數到m的人被殺,剩下的人繼續遊戲,活到最後的乙個人是勝利者。請輸出最後乙個人的...
迴圈鍊錶 約瑟夫問題
n個人想玩殘酷的死亡遊戲,遊戲規則如下 n個人進行編號,分別從1到n,排成乙個圈,順時針從1開始數到m,數到m的人被殺,剩下的人繼續遊戲,活到最後的乙個人是勝利者。請輸出最後乙個人的編號。input 輸入n和m值。output 輸出勝利者的編號。struct st cr int n 建立迴圈鍊錶 t...