Java 使用链表实现约瑟夫环

约瑟夫环是一个数学的应用问题:已知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;
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值