约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
数据结构:循环链表,方法是创建链表和删除节点。
待改进:不支持m=1时的情况,所以step是从2开始的。m=1的情况是输出从1到n,也可以直接加到主函数中
package job;
import java.util.Scanner;
public class CircleLink {
public node first;
public node tail;
public CircleLink()
{
first = null;
tail = null;
}
//创建一个循环链表
public void create(int n)
{
for(int i = 1; i<=n; i++)
{
node p = new node();
p.data = i;
if(first == null)
{
first = p;
tail=p;
p.next=p;
}
else
{
tail.next=p;
tail=p;
tail.next=first;
}
}
}
//删除节点,参数为要删除节点的上一个节点,返回值为删除掉的节点
public int delete(node v)
{
int num=v.next.data;
v.next=v.next.next;
return num;
}
public static void main(String[] args)
{
CircleLink c = new CircleLink();
Scanner input=new Scanner(System.in);
int n = input.nextInt();
int step;
int len;
for(step = 2; step <=24; step++)
{
System.out.println("step"+step+":");
len =n;
c.create(n);
while(len>0)
{
for(int i=1;i<step-1;i++)
{
c.first=c.first.next;
}
int v = c.delete(c.first);
c.first=c.first.next;
System.out.print(v + " ");
len--;
}
c.first = null;
c.tail = null;
System.out.println();
}
}
}