約瑟夫問題(單向迴圈鍊錶)

2021-10-22 14:22:57 字數 1979 閱讀 1779

約瑟夫問題有時也稱為約瑟夫斯置換或者猴子選大王問題,是乙個出現在電腦科學和數學中的問題。

在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱"丟手絹問題"。

假設有nums個節點,從第startno個開始報數,輸出第countnum個節點,並將第countnum個節點從nums個節點中刪除,請問輸出節點的順序。

/**

* 建立乙個node類

*/class

node

public

intgetno()

public

void

setno

(int no)

public node getnext()

public

void

setnext

(node next)

}

/*

* 建立乙個環形的單向鍊錶

*/class

josephutil

node curnode = null;

// 輔助指標,幫助構建環形鍊錶

// 使用for來建立我們的環形鍊錶

for(

int i =

1; i <= nums; i++

)else}}

/* * 遍歷當前的環形鍊錶

*/public

void

shownode()

// first始終指向第乙個節點,需要使用乙個輔助指標完成遍歷

node curnode = first;

while

(true

) curnode = curnode.

getnext()

;}}/**

* 根據輸入的內容,計算出輸出的順序

* * @param startno 表示從第幾個節點開始數

* @param countnum 表示第幾個開始輸出

* @param nums 表示在環形鍊錶中有多少個節點

*/public

void

josephprint

(int startno,

int countnum)

// 輸出節點前,先讓first移動k-2次

for(

int j =

0; j <

(startno + nums -2)

% nums; j++

)// 建立輔助指標,指向first節點的後面乙個節點

node helper = first;

first = helper.

getnext()

;// 當輸出節點時,讓first和helper指標同時移動m-1次, 然後輸出

// 迴圈結束後,環形鍊錶中只有乙個節點

while

(true

)// 讓first和helper指標同時移動countnum-1次

for(

int j =

0; j < countnum -

1; j++

)// first指向的節點就是要輸出的節點

system.out.

printf

("節點%d輸出\n"

, first.

getno()

);// 將first指向的節點從環形鍊錶中刪除

first = first.

getnext()

; helper.

setnext

(first);}

system.out.

printf

("最後乙個節點編號%d \n"

, first.

getno()

);}}

/**

* 測試

*/public

class

joseph

}

單向迴圈鍊錶 約瑟夫問題

班級活動中,乙個班n人圍成一圈玩遊戲時,從某乙個人開始數數,當數到m的那個人必須表演乙個節目,同時這個人退出遊戲。如何安排位置,能使自己避免表演節目呢?此類問題與約瑟夫問題是同一類問題。有名的約瑟夫問題 n個人圍成一圈,從第乙個開始報數,第m個將被殺掉,最後剩下乙個,其餘人都將被殺掉。例如n 5,m...

單向迴圈鍊錶 約瑟夫環

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

golang解決約瑟夫問題,單向迴圈鍊錶實現

這是經典的約瑟夫環,並且期望剩餘的人數是2,我們這裡也做了乙個通配,可以輸入期望剩餘的人數,比如期望剩餘1個,那麼31這個位子可以存活。當然解決關鍵就是得用到單向迴圈鍊錶,語言自然選擇的是golang,當然這算是第一版本以實現功能為主,還有很多待改進的地方。let s go 第一.我們先演繹一下,我...