约瑟夫环问题
设编号1,2,3…n的n个人围坐一圈,从编号为k的人从1开始报数,数到m的人出列。他的下一位继续从1开始报数,数到m的人出列,以此类推,直到所有人出列位置,由此产生一个出队编号的序列。
使用不带头结点的循环链表处理该问题、
package f1;
public class g1{
public static void main (String []args) {
// n=5 五个人 k=1从第一个人开始报数 m=2数两下
CircleSingleLinkedList List = new CircleSingleLinkedList();
List.addnode(8);
List.ysf(1, 2);
}
}
class CircleSingleLinkedList{
private node first =new node(-1); //头结点
public void addnode(int num) {
//创建num个节点的环形链表
node temp,curnode=first;
for(int i=0; i<num;i ++) {
temp = new node(i+1);
curnode.next = temp;
temp.next = first;
curnode = temp;
}
}
public void showlist() {
node temp = first ;
while(true) {
if(temp.next == first) break;
temp = temp.next ;
System.out.println(temp.No);
}
}
public void ysf(int k,int m) {
node temp = first,helper=null;
int u=m;
while(k-- > 0) {
helper = temp;
temp = temp.next;
}
while(true) {
if(temp == helper){
//System.out.println(temp.No);
break;
}
while(m-- > 0) {
helper = temp;
temp = temp.next;
if(temp == first) {
helper = temp;
temp = temp.next;
}
}
m=u;
if(temp.No != -1)
System.out.println(temp.No);
helper.next = temp.next;
}
}
}
//创建第一个节点,让first指向该节点
//没创建新的节点就把该节点加入到已有的环形链表中
class node{
public int No;
public node next;
public node(int no) {
this.No = no;
}
}