1、使用循环链表获取出环的序列:
public static Node build(int k){
Node root=new Node();
Node head=root;
root.dat=1;
int i=2;
while(i<=k){
Node node=new Node();
node.dat=i;
root.next=node;
root=root.next;
i++;
}
root.next=head;
return head;
}
public static class Node{
int dat;
Node next;
}
public static void cir1(int n,int m){
Node root=build(n);
for(int i=0;i<n;i++){
for(int j=0;j<m-1;j++){
root=root.next;
}
System.out.print(root.next.dat+" ");
if(i>n-3){
root.next=root;
}else{
root.next=root.next.next;
}
}
}
2、约瑟夫环:最后一个出环的
public static int cir(int n,int m){
int s=0;
for(int i=2;i<=n;i++){
s=(s+m)%i;
}
return s+1;
}
3、获取每次出环的数
public static void allCir(int m,int n){
for(int i=1;i<=m;i++){
System.out.println(i+"次:"+fun(m,n,i));
}
}
public static int fun(int m,int k,int i){
if(i==1){
return (m+k-1)%m;
}else{
return (fun(m-1,k,i-1)+k)%m;
}
}