package Josephu;
import java.util.Scanner;
public class JosephuTest {
/*
* 采用单链表的环形结构实现约瑟夫问题
*/
public static void main(String[] args) {
// 终端输入n,m数据,n为孩子数量,m为第几个编号退出
Scanner scanner = new Scanner(System.in);
CircleLinkList link = new CircleLinkList();
String str = scanner.next();
link.add(Integer.valueOf(str.split(",")[0]));// 生成单循环链表
link.show();// 显示循环链表
link.josephuTest(Integer.valueOf(str.split(",")[1]));// 输出踢出编号的顺序
}
}
// 建立环形链表
class CircleLinkList{
LinkNode firstNode = new LinkNode(0);// 一个单独的节点,用于指向循环链表第一个元素
//添加数据
public void add(int n) {
// 判断输入的整数是否合理
if (n < 1) {
System.out.println("输入数据小于1,请重新输入");
return;
}
// 遍历增加循环链表的每个元素
LinkNode pre = firstNode;
LinkNode p = null;
for (int i = 1; i <= n; i++) {
LinkNode tmp = new LinkNode(i);
pre.next = tmp;
pre = pre.next;
p = tmp;
}
p.next = firstNode.next;// 头尾相连,生成循环链表
}
// 显示循环链表中的数据
public void show() {
if (firstNode.next == null) {
System.out.println("请先输入数据");
return;
}
// 遍历每个节点,并结合计算器判断是否遍历完成
LinkNode tmp = firstNode.next;
int count = 0;
while (true) {
if (tmp == firstNode.next && count > 0) {
return;
}
System.out.println("小孩子的编号: " + tmp.num);
count++;
tmp = tmp.next;
}
}
// 约瑟夫问题,n个孩子围成一个圈,从1开始报数,数到m时,去掉这个节点,并从1开始继续报数
// 输出所有孩子的编号
public void josephuTest(int m) {
LinkNode tmp = firstNode.next;
while (true) {
// 循环到m节点的前一个节点,方便删除
for (int i = 1; i <= m - 2; i++) {
tmp = tmp.next;
}
if (tmp.next == tmp) {// 判断是否是最后一个节点
System.out.print(tmp.num);
return;
} else {
System.out.print(tmp.next.num + "->");
tmp.next = tmp.next.next;// 删除报数为m的节点
tmp = tmp.next;// 从下一个节点开始报数
}
}
}
}
// 建立节点类
class LinkNode {
int num;
LinkNode next;
// 初始函数,构造器
LinkNode(int num) {
this.num = num;
}
}
基于Java的循环单链表实现约瑟夫问题
最新推荐文章于 2024-03-23 11:16:14 发布