今天看視頻教程無心間看到了一個數3減1的問題,百度之發現叫約瑟夫環問題,因而寫了程序,問題大體描述以下:數據結構
一羣帶有編號的孩子手拉手圍成一個圈報數,開始的孩子數1,他右邊數2,再右邊數3,數到n的孩子out,接着從下一個孩子開始繼續數1,數到n的孩子out,如此循環...問最後留下來的孩子是原來的多少號?ui
我這裏用Java寫了一個雙向迴環鏈表表明圍成的圈,其中的Kid是一個鏈表節點,他有一個左同胞,一個右同胞,還有一個id。雙向會還鏈表定義了添加節點方法add(),刪去節點方法delete();隊首孩子firstKid,隊尾孩子LastKid,還有表的長度count。spa
class Kidcircle{ private int count; Kid firstKid; Kid LastKid; Kidcircle(int num){ count = 0; for(int i=0;i<num;i++){ add(); } } private void add(){ Kid k = new Kid(); k.id = count+1; if(count==0){ LastKid = k; firstKid = k; } else { k.left = LastKid; k.right = firstKid; LastKid.right = k; firstKid.left = k; LastKid = k; } count++; } public void delete(Kid k){ if(count<=1){ return; } else { count--; k.left.right = k.right; k.right.left = k.left; if(k == firstKid){ firstKid = k.right; }else if(k==LastKid){ LastKid = k.left; } } } public int getSize(){ return count; } }
Kid類以下:code
class Kid{ Kid left; Kid right; int id; }
而後main方法中這麼寫的,我假設的是數到3淘汰一個孩子,而後一共500人:視頻
public class count3quit { public static void main(String[] args){ Kidcircle Kc = new Kidcircle(500); Kid currentKid = Kc.firstKid; while(Kc.getSize()>1){ Kc.delete(currentKid.right.right); currentKid = currentKid.right.right; } System.out.println(Kc.firstKid.id); } }
最後結果:436。blog
有時間仍是要多回顧數據結構中的東西。教程