單向環形鍊錶

2021-10-13 05:15:43 字數 2065 閱讀 7165

問題描述:

設編號為:1,2,3,4…n的n個人圍坐一圈,約定編號為第k(1<=k<=n)的那個人,從1開始報數,數到m的那個人出列,它的下一位又開始從1報數,數到m的那個人又出列,依次類推,知道所有人出列為止,由此產生了乙個出隊編號的序列。

建立環形鍊錶並且遍歷**實現:

public

class

josephu

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

class

circlesinglelinkedlist

boy curboy = null;

for(

int i =

1; i <= nums; i++

)else}}

//遍歷當前環形鍊錶

public

void

showboy()

//因為first不能動,因此我們人然使用乙個輔助指標完成遍歷

boy curboy = first;

while

(true

) curboy = curboy.

getnext()

;//將輔助指標後移}}

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

**實現

/**

** @param startno 表示從第幾個小孩開始數數

* @param countnum 表示數幾下

* @param nums 表示最初有多少小孩在圈中

*/public

void

countboy

(int startno,

int countnum,

int nums)

//建立乙個輔助指標helper指向環形鍊錶的最後乙個節點

boy helper = first;

while

(true

) helper = helper.

getnext()

;//否則向後遍歷

}//小孩報數前,因為我們需要從指定的位置進行報數,所以先讓first和helper移動k-1次到開始報數的位置

for(

int i =

0; i < startno -

1; i++

)//當小孩報數時,讓first和helper指標同時的移動m-1次,然後出圈

//這裡迴圈刪除節點,知道剩下乙個節點為止

while

(true

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

for(

int i =

0; i < countnum -

1; i++

)//這時first指向的節點就是要出圈的節點

system.out.

println

("出圈的小孩編號為:"

+first.

getno()

);//將first從環形鍊錶中刪除

first = first.

getnext()

; helper.

setnext

(first);}

system.out.

println

("最後乙個小孩編號為:"

+helper.

getno()

);}}

單向環形鍊錶

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

單向環形鍊錶

建立孩子節點 孩子節點 class child public intgetno public void setno int no public child getnext public void setnext child next 建立環形鍊錶類,讓first節點為空 class circleli...

單向環形鍊錶

單向環形列表 單向環形列表 建立單向環形列表 先建立乙個節點,構成環形,並且讓first節點指向這個節點,這個first節點用來建立環形鍊錶 當我們後面建立的節點,依次新增到這個環形鍊錶中,定義乙個輔助變數temp指向first 遍歷環形鍊錶 定義乙個輔助節點temp指向first節點,通過乙個wh...