1. 程式人生 > >Java 使用連結串列實現約瑟夫環

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;
	}
}