約瑟夫問題(迴圈鍊錶)練習

2021-10-10 02:15:27 字數 2134 閱讀 1647

約瑟夫問題是個著名的問題: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...