單向環形鍊錶(約瑟夫問題)

2021-10-05 13:12:05 字數 1729 閱讀 8485

josephu 問題

josephu問題為:設編號為1,2, … n的n個人圍坐一圈,約定編號為k (1<=k<=n) 的人

從1開始報數,數到m的那個人出列,它的下一位又從1開始報數,數到m的那個人又出列,依次類推,直到所有人出列為止,由此產生-乙個出隊編號的序列。

提示用乙個不帶頭結點的迴圈鍊錶來處理josephu問題:先構成乙個有n個結點的單迴圈鍊錶,

然後由k結點起從1開始計數,計到m時,對應結點從鍊錶中刪除,然後再從被刪除結點的下乙個結點又從1開始計數,直到最後乙個結點從鍊錶中刪除演算法結束。

package com.linkedlist;

public

class

josepfu

}//建立乙個環形單向鍊錶

class

circlesinglelinkedlist

boy curboy =null;

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

//for迴圈建立環形鍊錶

for(

int i=

1;i<=nums;i++

)else}}

public

void

showboy()

//first不動 需要輔助指標

boy curboy = first;

while

(true

) curboy = curboy.

getnext()

;}}//根據使用者的輸入 計算出小孩出圈順序

//startno 表示從第幾個小孩開始數

//countnum 數幾次

//nums 最初有多少個小孩在圈中

public

void

countboy

(int startno,

int countnum,

int nums)

//建立輔助指標 幫助小孩出圈

boy helper =first;

while

(true

)else

}//小孩報數前 先讓first與helper移動k-1次

for(

int j=

0;j1;j++

)//出圈 迴圈操作 直到圈中只有乙個節點

while

(true

)else

//此時first為要出圈的小孩

system.out.

println

("出圈小孩編號"

+first.

getno()

);//將first節點出圈

first = first.

getnext()

; helper.

setnext

(first);}

} system.out.

println

("最後僅有的小孩編號"

+first.

getno()

);}}

//先建立乙個boy類 表示乙個節點

class

boypublic

intgetno()

public boy getnext()

public

void

setnext

(boy next)

public

void

setno

(int no)

}

約瑟夫問題 單向環形鍊錶

約瑟夫問題的示意圖 josephu 問題 josephu 問題為 設編號為 1,2,n 的 n 個人圍坐一圈,約定編號為 k 1 k n 的人從 1 開始報數,數到 m 的那個人出列,它的下一位又從 1 開始報數,數到 m 的那個人又出列,依次類推,直到所有人出列為止,由此 產生乙個出隊編號的序列。...

單向環形鍊錶 約瑟夫問題

如圖,鍊錶的最後乙個節點的next指向鍊錶的第乙個節點,形成乙個環形鍊錶。josephu 約瑟夫 約瑟夫環 問題 設編號為1,2,3 n的 n個人坐成一圈,編號為k 1 k n 的人從1開始報數,數到m的那個人出列,他的下一位繼續從1開始報數,數到m的那個人又出列,依次類推,直到所有人出列為止,由此...

單向環形鍊錶 約瑟夫問題

單向環形鍊錶 約瑟夫問題 單向環形鍊錶 joseph 約瑟夫 約瑟夫環 問題 joseph 問題為 設編號為1,2,n 的n 個人圍坐一圈,約定編號為k 1 k n 的人從1 開始報數,數到m 的那個人出列,它的下一位又從1 開始報數,數到m 的那個人又出列,依次類推,直到所有人出列為止,由此產生乙...