約瑟夫問題的解決
問題概述
有n個人,編號爲1~n,從k個人開始報數,從1開始報,報到m的人會死掉,然後從第m+1個人開始,重複以上過程。在死了n-1個人後,問最後一個人的編號是?
package learn;
/**
* 單向環形列表
* 直接使用前邊定義的鏈表和節點了,
*/
public class CircleLinkList {
public static void domethod(int num,int k,int m){
if(k>num){
return;
}
LinkList linkList = new LinkList();
Node temp=linkList.head;
for(int i=1;i<=num;i++){
linkList.add(new Node(i));
temp=temp.next;//最終時尾節點
}
// linkList.list();
Node first = linkList.head.next;//第一個人,編號爲一
// System.out.println(first);
temp.next=first;//寫了這麼多就是想讓形成一個鏈表
// linkList.list();//再使用這個會一直遍歷
// Node tempnode;
while (first.data!=k){
first=first.next;//找到第K個人
temp = temp.next;
}
// System.out.println("=========");
// System.out.println(first);
// System.out.println(temp);
int i=1;//從一開始報數。
while (true){
if(temp.next==first&&first.next==temp){
if(m%2==0){
System.out.println("========");
System.out.println(temp);
System.out.println(first);
}
else{
System.out.println("*********");
System.out.println(first);
System.out.println(temp);
}
break;
}
if(i==m){
temp.next=first.next;
System.out.println(first);
first=temp.next;
i=1;
}
else{
i++;
first=first.next;
temp=temp.next;
}
}
}
public static void main(String[] args) {
CircleLinkList.domethod(5,3,2);
}
}
重點思路在於剩下倆人的時候怎麼辦,想了一個辦法,此時,i=1,就剩下first和temp兩個元素,而first所指的元素,此時時i,直接m單數時first,雙數時temp輸出即可!