鹹魚學資料結構和演算法 約瑟夫問題

2021-10-16 13:21:31 字數 1703 閱讀 6727

目錄

一、約瑟夫問題介紹

二、約瑟夫問題演算法介紹

三、約瑟夫問題**實現

設編號為1,

2,… n的

n個人圍坐一圈,約定編號為k(

1<=k<=n

)的人從

1開始報數,數到

m 的那個人出列,它的下一位又從

1開始報數,數到

m的那個人又出列,依次類推,直到所有人出列為止,由此產生乙個出隊編號的序列

1.首先構建乙個單向的環形鍊錶

①先建立第乙個節點

, 讓

first

指向該節點,並形成環形

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

2.按照需求建立乙個輔助指標(變數

) helper ,

事先應該指向環形鍊錶的最後這個節點.

補充: 小孩報數前,先讓

first

和helper

移動 k - 1次

3.當小孩報數時,讓

first

和 helper

指標同時的移動 

m  - 1 次

4.這時就可以將

first

指向的小孩節點出圈

first = first .next

helper.next = first 

原來first

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

public class josepfu 

}class singlecirclelist

// 臨時指標,用來新增結點

boy curboy=null;

// 新增結點過程

for (int j=1;j<=nums;j++)else }}

// 遍歷迴圈單鏈表

public void showboy()

// 使用curboy來指向最開始的節點

boy curboy=first;

// 對迴圈單鏈表進行遍歷

while (true)

curboy=curboy.getnext();}}

// 解決約瑟夫問題

// k為約定編號

// m為報數個數

// n為圈人數

public void countboy(int k,int m,int n)

helper=helper.getnext();

}// 從第k個開始數

for (int j=0;jwhile (true)

for (int j=0;jsystem.out.println("小孩編號:"+first.getno());

first=first.getnext();

helper.setnext(first);}}

}class boy

public int getno()

public void setno(int no)

public boy getnext()

public void setnext(boy next)

}

鹹魚學資料結構和演算法 佇列(陣列實現)

目錄 一 佇列介紹 二 陣列模擬佇列介紹 三 陣列模擬佇列 實現 將尾指標往後移 rear 1 當front rear 空 若尾指標 rear 小於佇列的最大下標 maxsize 1,則將資料存入 rear所指的陣列元素中,否則無法存入資料。rear maxsize 1 佇列滿 system.out...

鹹魚學資料結構和演算法 單鏈表反轉

目錄 一 單鏈表反轉演算法介紹 二 單鏈表反轉 實現 1.先定義乙個節點 reversehead new heronode 2.從頭到尾遍歷原來的鍊錶,每遍歷乙個節點,就將其取出,並放在新的鍊錶 reversehead 的最前端.3.原來的鍊錶的 head.next reversehead.next...

演算法和資料結構 約瑟夫問題

package com.structure.demo import android.os.bundle import android.util.log public class josephactivity extends activity class circlesinglelinkedlist ...