iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java用单向环形链表来解决约瑟夫环Josepfu问题
  • 379
分享到

Java用单向环形链表来解决约瑟夫环Josepfu问题

2024-04-02 19:04:59 379人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

简单介绍 如果把单链表的最后一个节点的指针指向链表头部,而不是指向NULL,那么就构成了一个单向循环链表,通俗讲就是让尾节点指向头结点。 单向环形链表应用场景:Josephu(约瑟

简单介绍

如果把单链表的最后一个节点的指针指向链表头部,而不是指向NULL,那么就构成了一个单向循环链表,通俗讲就是让尾节点指向头结点。

在这里插入图片描述

单向环形链表应用场景:Josephu(约瑟夫、约瑟夫环)问题:
设编号为1, 2, … n的n个人围坐一圈,约定编号为k (1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。

代码实现

节点类


//节点类
class Jnode {
    private int id;
    private JNode next;

    public JNode(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public JNode getNext() {
        return next;
    }

    public void setNext(JNode next) {
        this.next = next;
    }
    
}

链表类(包括节点管理和约瑟夫环问题解决)


//链表类
class CircleSingleLinkedList {
    private JNode first = null; //定义第一个节点,未创建时为null

    //添加节点,构建环形链表
    public void add(int num) {
        if (num < 1){
            System.out.println("创建个数不符合规定!");
            return;
        }
        JNode curNode = null; //辅助变量
        for (int i = 1; i <= num; i++) {
            JNode newNode = new JNode(i);
            if (i == 1){ //第一个节点较为特殊
                first = newNode; //真正创建了第一个节点
                first.setNext(first); //形成环状
                curNode = first; //让辅助变量开始作用
            }else { //第二个及其之后节点
                curNode.setNext(newNode); //让当前节点指向新建的节点
                newNode.setNext(first); //让新建的节点指向第一个节点,形成环状
                curNode = newNode; //更新辅助变量
            }
        }
    }

    //遍历链表
    public void list(){
        if (first == null){
            System.out.println("链表为空!");
            return;
        }
        JNode temp = first;
        while (true){
            System.out.printf("取出节点%d\n",temp.getId());
            if (temp.getNext() == first){ //说明已经遍历到最后一个了
                break;
            }
            temp = temp.getNext();
        }
    }

    //根据参数让节点出圈(Josepfu)
    public void josepfu(int startNode,int count,int num){ //startNode为开始的那个节点,count为每次数第几个,num为链表节点个数
        if (first == null || startNode < 1 || count < 1 || startNode > num){
            System.out.println("链表为空或者输入的参数不符合标准!");
            return;
        }
        //让first移动到startNode指定的节点,即移动startNode-1次
        for (int i = 0; i < startNode - 1; i++) {
            first = first.getNext();
        }
        //创建一个辅助变量,让其指向最后一个节点(first前一个)
        JNode helper = first;
        while (helper.getNext() != first){
            helper = helper.getNext();
        }
        //开始按照要求出圈,每次都让helper和first移动count-1次
        while (true){
            if (helper == first){ //圈中只剩下一个节点
                break;
            }
            for (int i = 0; i < count - 1; i++) {
                first = first.getNext();
                helper = helper.getNext();
            }
            //此时first指向的即为要出圈的节点
            System.out.printf("节点%d出圈\n",first.getId());
            //将出圈的节点从链表中移除
            first = first.getNext();
            helper.setNext(first);
        }
        System.out.printf("节点%d为最后一个节点",first.getId());
    }
}

测试



public class JosepfuTest {
    public static void main(String[] args) {

        CircleSingleLinkedList linkedList = new CircleSingleLinkedList();

        linkedList.add(5);

        linkedList.list();
        System.out.println("===================");

        linkedList.josepfu(1,2,5);
    }
}

到此这篇关于Java用单向环形链表来解决约瑟夫环Josepfu问题的文章就介绍到这了,更多相关Java 单向环形链表 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java用单向环形链表来解决约瑟夫环Josepfu问题

本文链接: https://www.lsjlt.com/news/154774.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java用单向环形链表来解决约瑟夫环Josepfu问题
    简单介绍 如果把单链表的最后一个节点的指针指向链表头部,而不是指向NULL,那么就构成了一个单向循环链表,通俗讲就是让尾节点指向头结点。 单向环形链表应用场景:Josephu(约瑟...
    99+
    2024-04-02
  • 【链表问题】环形单链表约瑟夫问题
    前言以专题的形式更新刷题贴,欢迎跟我一起学习刷题,相信我,你的坚持,绝对会有意想不到的收获。每道题会提供简单的解答,如果你有更优雅的做法,欢迎提供指点,谢谢【题目描述】【要求】输入:一个环形单向链表的头节点 head 和报数 m.返回:最后...
    99+
    2023-06-02
  • Java使用单链表实现约瑟夫环
    本文实例为大家分享了Java使用单链表实现约瑟夫环的具体代码,供大家参考,具体内容如下 构建一个单向的环形链表思路 1.先创建第一个节点, 让first指向该节点, 并形成环形 2....
    99+
    2024-04-02
  • C语言用循环单链表实现约瑟夫环
    用循环单链表实现约瑟夫环(c语言),供大家参考,具体内容如下 源代码如下,采用Dev编译通过,成功运行,默认数到三出局。 主函数: main.c文件 #include <s...
    99+
    2024-04-02
  • PHP怎么解决约瑟夫环问题
    这篇文章主要讲解了“PHP怎么解决约瑟夫环问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP怎么解决约瑟夫环问题”吧!约瑟夫环问题(猴子选大王)PHP版约瑟夫斯问题问题有时候也被描述成...
    99+
    2023-06-22
  • Java数据结构与算法之双向链表、环形链表及约瑟夫问题深入理解
    目录一、双向链表二、环形链表及其应用:约瑟夫问题环形链表图示构建一个单向的环形链表思路遍历环形链表约瑟夫问题一、双向链表 使用带head头的双向链表实现 - 水浒英雄排行榜管理单向链...
    99+
    2024-04-02
  • JavaScript三种方法解决约瑟夫环问题的方法
    目录概述问题描述循环链表有序数组数学递归总结概述 约瑟夫环问题又称约瑟夫问题或丢手绢问题,是一道经典的算法问题。问题描述也有很多变式,但大体的解题思路是相同的。本篇将以循环链表、有序...
    99+
    2024-04-02
  • C语言数据结构中约瑟夫环问题如何解决
    本文小编为大家详细介绍“C语言数据结构中约瑟夫环问题如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言数据结构中约瑟夫环问题如何解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。问题描述约瑟夫环问题的...
    99+
    2023-07-04
  • java基于双向环形链表解决丢手帕问题的示例分析
    这篇文章主要为大家展示了“java基于双向环形链表解决丢手帕问题的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java基于双向环形链表解决丢手帕问题的示例分析”这篇文章吧。具体如下:问...
    99+
    2023-05-30
    java
  • C语言实例真题讲解数据结构中单向环形链表
    目录1、例题引入2、何为带环链表3、题解思路4、拓展问题目录 1、例题引入 链接直达: 环形链表 题目: 2、何为带环链表  正常的单链表每个节点顺次链接,最后一个节点指...
    99+
    2024-04-02
  • java使用单向链表解决数据存储自定义排序问题
    目录表设计1. 新增一条记录2. 修改排序3. 删除代码实现1. 简单对象2. 对数据按照 nextId 排序3. 输出结果表设计 CREATE TABLE `test` ( `...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作