java使用链表实现约瑟夫环

Java使用链表实现约瑟夫环

什么是约瑟夫环

约瑟夫环(Josephus problem)是一个有名的问题。传说中,约瑟夫和他的39个朋友圈在一个洞穴中,被罗马军队包围。他们决定集体死了,不肯去做罗马的奴隶。约瑟夫是一个退役士兵,提议从一个人开始,每隔三个人就杀掉一个人。由他开始,最后剩下一个人,他可以叫作胜利。现在问你,应该站在哪个位置,才能够成为那个幸存者?

链表的基本概念

链表是一种常见的数据结构,它由若干个节点(node)组成,每个节点包含两部分:数据域和指针域。其中数据域保存节点的数据,指针域保存下一个节点的地址。链表的头指针指向链表的第一个节点,链表最后一个节点的指针域指向空地址(NULL)。

思路

由于约瑟夫环问题中每个人被杀死后需要从圈中删除,所以我们可以用一个链表表示这个圆圈。第一步,我们先将 $n$ 个人的编号从 $1$ 到 $n$ 建立起来,然后将它们构成一个单向循环链表。

第二步,从第 $k$ 个人开始报数,记为 $m$。然后移动 $m-1$ 个节点,对应的节点即为要删除的节点。删除节点后,重新从当前节点开始报数,直到剩下最后一个节点为止。

Java代码实现

class Node {
    public int value;
    public Node next;

    public Node(int value) {
        this.value = value;
    }
}

public class CircleLinkedList {

    public static Node create(int n) {
        Node head = new Node(1);
        Node p = head;
        for (int i = 2; i <= n; i++) {
            p.next = new Node(i);
            p = p.next;
        }
        p.next = head;
        return head;
    }

    public static void josephus(Node head, int k, int m) {
        Node p = head;
        for (int i = 0; i < k - 1; i++) { // 找到起始节点
            p = p.next;
        }
        while (p.next != p) { // 当链表只有一个节点时结束
            for (int i = 0; i < m - 1; i++) {
                p = p.next;
            }
            System.out.print(p.next.value + " "); // 输出要删除的节点的下一个节点
            p.next = p.next.next; // 删除该节点
        }
        System.out.println("\n剩余节点:" + p.value);
    }

    public static void main(String[] args) {
        int n = 10;
        int k = 3;
        int m = 5;
        Node head = create(n);
        System.out.println("链表中节点的编号依次为: ");
        for (int i = 1; i <= n; i++) {
            System.out.print(head.value + " ");
            head = head.next;
        }
        System.out.println("\n按照约瑟夫环的规则,出列的顺序为:");
        josephus(head, k, m);
    }
}

示例说明

示例一

假设有 $n = 5$ 个人,从第 $k = 1$ 个人开始报数,每报数到 $m = 2$ 个人将删除一个人,输出约瑟夫环的过程如下:

链表中节点的编号依次为: 
1 2 3 4 5 
按照约瑟夫环的规则,出列的顺序为:
2 4 1 5 
剩余节点:3

示例二

假设有 $n = 10$ 个人,从第 $k = 3$ 个人开始报数,每报数到 $m = 4$ 个人将删除一个人,输出约瑟夫环的过程如下:

链表中节点的编号依次为: 
1 2 3 4 5 6 7 8 9 10 
按照约瑟夫环的规则,出列的顺序为:
4 8 2 7 3 10 1 9 6 
剩余节点:5

注意:以上示例中生成链表时编号从 $1$ 到 $n$,要输出约瑟夫环的过程还需要遍历整个链表输出每个节点的编号。实际的应用场景中,可以根据业务需求设计节点的数据域。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java使用链表实现约瑟夫环 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 微信小程序(十六)form组件详细介绍

    让我来为你详细讲解“微信小程序(十六)form组件详细介绍”的完整攻略。 什么是form组件 在小程序中,form组件是一种用于提交表单数据的组件。form组件可以包含input、textarea、button等表单元素。每个表单元素都有一个name属性和一个value属性,表单元素的数据可以在提交时一并提交到服务器端。 form组件的使用方法 form组件…

    Java 2023年5月23日
    00
  • Java SimpleDateFormat线程安全问题原理详解

    Java SimpleDateFormat线程安全问题原理详解 简介 SimpleDateFormat 是 Java 中处理日期格式化的常用类,常用来将 Date 类型转换成特定格式的字符串。然而,SimpleDateFormat 是非线程安全的,当多个线程同时访问同一个 SimpleDateFormat 实例时,就会出现线程安全问题。本文将通过分析 Sim…

    Java 2023年6月1日
    00
  • h2database在springboot中的使用教程

    下面就是 “h2database 在 Spring Boot 中的使用教程”的完整攻略: 1. h2database 简介 h2database 是一种 Java 语言编写的嵌入式数据库,它提供了轻量级的高效数据存储方案。在开发 Spring Boot 应用程序时,我们可以选择在项目中使用内置的 h2database 引擎来支持数据存储和查询。 2. 引入 …

    Java 2023年5月20日
    00
  • 带你快速搞定java数组

    带你快速搞定Java数组 Java数组是一种常用的数据结构,它允许存储一组相同类型的数据。本文将向您介绍如何使用Java数组。 创建数组 在Java中,使用以下语法创建一个数组: <数据类型>[] <数组名称> = new <数据类型>[<数组长度>]; 其中, <数据类型>是要存储在数组中的数据类…

    Java 2023年5月26日
    00
  • 在.jsp中非表单请求action的几种方式总结

    关于“在.jsp中非表单请求action的几种方式总结”的攻略,我将按照以下步骤进行讲解: 1. 此类请求的定义 在jsp中,我们通常通过表单来提交数据进行后台处理。但是,有时候我们也需要通过非表单请求来实现一些操作,比如: 通过超链接跳转页面 在jsp中使用ajax进行异步请求 在jsp中使用iframe嵌入其他页面 点击页面上的按钮或链接,触发相应的操作…

    Java 2023年6月15日
    00
  • 如何在jsp界面中插入图片

    在JSP界面中插入图片,可以使用HTML标签来实现。下面是详细的步骤: 1. 在JSP页面中使用标签 在JSP页面中,使用以下代码追加标签到对应的位置: <img src="图片地址"> 其中,src属性指定了图片的路径。图片可以是相对路径或者绝对路径。如: 相对路径: <img src="../assets/…

    Java 2023年6月15日
    00
  • Java利用Dijkstra和Floyd分别求取图的最短路径

    Java 利用 Dijkstra 和 Floyd 算法分别求取图的最短路径可以分为以下几个步骤: 1. 建立图的数据结构 首先需要建立用于表示图的数据结构,通常可以使用邻接矩阵或邻接表来表示图。 以邻接矩阵为例,可以定义一个二维数组来表示图,数组中的每一个元素 a[i][j] 表示从节点 i 到节点 j 的边的权值。如果不存在从节点 i 到节点 j 的边,则…

    Java 2023年5月26日
    00
  • SpringBoot 集成 Quartz + MySQL

    Quartz 简单使用Java SpringBoot 中,动态执行 bean 对象中的方法 源代码地址 => https://gitee.com/VipSoft/VipBoot/tree/develop/vipsoft-quartz 工作原理解读 只要配置好 DataSource Quartz 会自动进行表的数据操作, 添加 Quartz Job 任务…

    Java 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部