循环列表的Java实现,解决约瑟夫环问题

import java.util.Scanner;

/**
 * 循环列表的Java实现,解决约瑟夫环问题
 * 
 * @author LIU
 *
 */
public class LinkedList {
	// 定义结点,必须是static
	static class Node {
		int data;
		Node next;

		Node(int arg1) {
			this.data = arg1;
		}
	}

	public static void main(String[] args) {
		int n = 0, m = 0;// 定义总人数n,和出圈数字m
		// 输入n和m
		System.out.println("输入总人数n,出圈数字m");
		Scanner scanner = new Scanner(System.in);
		n = scanner.nextInt();
		m = scanner.nextInt();

		// 初始化循环列表,头结点first和尾结点p
		Node first = new Node(1);
		first.next = first;
		Node p = first;
		for (int i = 2; i <= n; i++) {
			Node temp = new Node(i);
			temp.next = p;
			p.next = temp;
			p = p.next;
		}
		p.next = first;// 尾接头形成循环链表(p为尾结点)

		// 执行出圈操作
		System.out.println("出圈顺序为:");
		while (p != p.next) {
			// 下面for循环后,p是第m个结点的前一个结点
			for (int i = 1; i < m; i++)
				p = p.next;
			// 删除第m个结点
			System.out.print(p.next.data + " ");
			p.next = p.next.next;
		}
		System.out.print("
幸运者是:" + p.data);
	}

}

  

原文地址:https://www.cnblogs.com/xiaodf/p/5027173.html