约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。求出出队序列。
采用链表实现,结点数据就是编号。
package com.dm.test;
public class Test2
{
public static void main(String[] args)
{
//头结点
Node root = new Node(1);
int[] order = build(root,9,5);
for(int i =0;i<order.length;i++)
{
System.out.print(order[i]+" ");
}
}
//将约瑟夫环建成一个链表
public static int[] build(Node root,int n, int m)
{
Node current = root;
for(int i = 2; i<=n; i++)
{
Node node = new Node(i);
current.next = node;
current = node;
}
current.next = root;
int[] order = come(root,n,m);
return order;
}
//出队列
//结束条件:只有一个结点时,这个结点的next是它自身
//将出来的数,放在一个数组中,遍历数组就是出队序列
public static int[] come(Node root,int n, int m)
{
int[] order = new int[n];
int j = 0;
Node p = root;
while(p.next!=p)
{
int i = 1;
while(i<m-1)
{
p=p.next;
i++;
}
if(i==m-1)
{
order[j]=p.next.data;
j++;
p.next = p.next.next;
p=p.next;
}
}
order[j]=p.data;
return order;
}
}
class Node
{
int data;
Node next;
public Node(int data)
{
this.data = data;
next= null;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持亿速云。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。