约瑟夫问题
约瑟夫问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。
package yueshefu;
//约瑟夫问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。
//例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3。
public class SingleLinkedList {
public static void main(String[] args) {
SingleLinkedList s = new SingleLinkedList();
s.add(5);
// s.look();
s.Josephusproblem(3);
}
Node first = null;
public void add(int n) {//初始化环形单向链表
Node cur = first;
for (int i = 1; i <= n; i++) {
Node node = new Node(i);
if (i == 1) {
first = node;
node.next = first;
cur = node;
} else {
cur.next = node;
node.next = first;
cur = node;
}
}
}
//查看循环单链表
public void look(){
Node temp = first;
while(temp.next != first){
System.out.println(temp.num);
temp = temp.next;
}
}
//约瑟夫问题
public void Josephusproblem(int m){
while(first.next != first){
for (int i = 1; i < m-1; i++) {
first = first.next;
}
Node cur = first.next.next;
System.out.print(first.next.num+" ");
first.next = cur;
first = first.next;
}
System.out.println("最后存活下来的是" + first.num);
}
}
Node类
package yueshefu;
public class Node {
public int num;
public Node next;
public Node(int num) {
super();
this.num = num;
}
@Override
public String toString() {
return "[num=" + num + "]";
}
}
思路:
1.先初始化环形单链表,输入n为单链表的长度,将第一个元素标记为first,以后每添加的最后一个元素的next都指向第一个元素,这样就形成环形单链表。
2.解决约瑟夫问题,用while循环环形单链表中只剩一个元素,然后找到先取出的元素的前一个元素,最后将他取出