資料結構 環形鍊錶

2021-10-11 18:59:45 字數 2926 閱讀 6582

約瑟夫問題

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

n = 5即有五個人

k=1,從第乙個人開始

m=2,數兩下

出佇列的順序是 2——4—–1—–5——-3

思路

1.先建立第乙個節點,讓我們的first指向該節點,並形成環形

2.後面當我們建立乙個新的節點,就把該節點,加入到已有的環形鍊錶中

遍歷環形鍊錶

先讓乙個輔助指標(變數),指向first節點

然後通過乙個while迴圈遍歷改環形鍊錶即可當:curboy.next = first結束

出圈思路

1.需要建立乙個輔助指標(變數)helper,事先應該指向環形鍊錶的最後這個節點

當然,我們要小孩報數前,讓first和helper移動k-1次,移動到k那個地方

2.當我們的小孩報數時,我們的first和helper同時移動m-1次

3.將我們first指向的小孩 節點出圈

​ first = first.next;

​ helper.next = first;

原來first指向的節點,就沒有任何引用了,就會被**

**實現

package com.wang.linkedlist;

/** * @author 王慶華

* @version 1.0

* @date 2020/12/9 21:07

* @description todo

* @pojectname 演算法**

*/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()

;//curboy向後面移動}}

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

/** *

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

* @param countnum 表示我們一次數幾下,一次報幾個數

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

*/public

void

countboy

(int startno,

int countnum,

int nums)

//建立輔助指標,幫助我們的小孩出圈

boy helper = first;

//需要建立乙個輔助指標(變數)helper,事先應該指向環形鍊錶的最後這個節點

while

(true

) helper = helper.

getnext()

;//往下走

}//小孩報數前,讓first和helper移動k-1次,移動到k那個地方

for(

int j =

0;j1;j++

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

//這裡是乙個迴圈操作,直到圈中只剩乙個

while

(true

)//讓first和helper同時移動conutnum -1

for(

int j =

0; j

1;j++

)//這是first指向的節點,就是要出圈的小孩

system.out.

println

("小孩出圈"

+first.

getno()

);//這時將first指向的小孩節點出圈

first = first.

getnext()

;//helper的next設定成我們刪除小孩節點的下乙個節點

helper.

setnext

(first);}

system.out.

println

("最後留在圈中的小孩編號是"

+first.

getno()

);}}

//建立乙個小孩類,表示乙個節點

class

boypublic

intgetno()

public

void

setno

(int no)

public boy getnext()

public

void

setnext

(boy next)

}

資料結構與演算法 環形鍊錶

約瑟夫 josephus 問題 約瑟夫問題 約瑟夫環 問題為 設編號為1,2,n的n個人圍坐在一起,約定編號為k 1 k n 的人 從1開始報數,數到m的那個人出列,他的下一列又從1開始報數,數到m的人出列,依次類推,直到所有人出列為止,由此產生乙個出隊編號的序列。方法 用乙個不帶頭結點的迴圈鍊錶來...

資料結構 迴圈鍊錶實現環形佇列

迴圈鍊錶寫迴圈佇列,只用乙個隊尾指標就夠了,因為迴圈鍊錶中隊尾節點的下乙個節點就是隊首節點。隊空條件 隊滿條件 不考慮 進隊操作 將新的節點插入到隊尾,稱為隊尾節點,然後隊尾指標指向這個新的節點。include include include define error 0 define ok 1 t...

資料結構與演算法之環形鍊錶

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