简洁明了!Java实现单向环形链表以解决约瑟夫环Josepfu问题

文章目录

    • 简单介绍
    • 代码实现


简单介绍

如果把单链表的最后一个节点的指针指向链表头部,而不是指向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());}
}

测试类

/*** @Author: Yeman* @Date: 2021-10-15-22:33* @Description:*/
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);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

荣耀v10Android9新功能,荣耀10、荣耀V10开启安卓9.0内测 日常领跑行业

【PConline 资讯】今天(8月9日)早上10点&#xff0c;荣耀总裁赵明发微博宣布荣耀已经有四款机型面向少部分用户推送安卓9.0内部测试版本。实际上&#xff0c;在8月8日晚上&#xff0c;花粉论坛就已经公布华为4款机型内测安卓 9.0 版本&#xff0c;荣耀手机两款旗舰进入升级名单…

状态模式 设计模式_设计模式:状态

状态模式 设计模式本文将介绍状态设计模式 。 它是行为设计模式之一 。 您无需了解许多理论即可了解模式的主要概念。 该文章将分为几个部分&#xff0c;在其中我将提供有关需要应用该模式的情况&#xff0c;它所具有的利弊以及用法示例的信息。 有时&#xff0c;当对象的内部…

Java中的AES加密和解密(CBC模式)

通过有线方式传输诸如纯文本密码之类的机密数据总是容易受到安全性的影响&#xff0c;始终建议对此类信息进行加密并使用SSL传输这些机密数据.Java为此提供了多种加密算法。在本文中&#xff0c;我们将讨论Java中具有CBC模式的AES&#xff08;高级加密标准&#xff09;对称加密…

hiti打印机android驱动,HiTi 打印机 驱动程序下载——更新 HiTi 软件

HiTi 打印机驱动程序下载如何手动下载和更新:你可以通过 %%os%% 或通过执行 Windows 更新获取基本的 HiTi Printer 驱动程序。 内置驱动程序将支持Printer的基本功能&#xff0c;但通常不支持更高级的功能。以下是手动更新这些 HiTi 设备驱动程序的完整指南。程序员: HiTi 类别…

Java实现最小二乘法线性拟合,传感与检测,单臂半桥全桥实验,江南大学自动化

因为作为资源上传不方便我们获取且我想免费分享给有需要的小伙伴&#xff0c;以后所有实验报告都通过文章形式记录输出了&#xff0c;仅供参考&#xff0c;欢迎交流。&#xff08;最小二乘法代码在文末&#xff09; 电桥特性曲线&#xff1a; Java实现最小二乘法线性拟合及计算…

android task详解,Android AsyncTask的使用详解

当然&#xff0c;我们在进行耗时操作或者更新UI时&#xff0c;是可以使用匿名线程的&#xff0c;但是此种方式是存在缺陷的&#xff1a;第一&#xff0c;线程的开销较大&#xff0c;如果每个任务都要创建一个线程&#xff0c;那么应用 程序的效率要低很多&#xff1b;第二&…

【Error】IDEA报错:org.jetbrains.jps.builders.java.dependencyView.TypeRepr$PrimitiveType cannot be cast t

错误日志&#xff1a; org.jetbrains.jps.builders.java.dependencyView.TypeRepr$PrimitiveType cannot be cast to org.jetbrains.jps.builders.java.dependencyView.TypeRepr$ClassType 解决方法&#xff1a;

ReSQL的?

大约在2009年创造出来的NoSQL名字标志着从“传统”关系模型的转变。 在2009年之前&#xff0c;有相当多的非关系数据库&#xff0c;但是在最近几年中&#xff0c;我们看到了许多新产品&#xff08;例如&#xff0c; 我在上一篇文章中可以看到“ NoSQL格局” &#xff09;。 一般…

数据结构,Java实现递归回溯,寻找出迷宫路线,解决迷宫问题

/*** Author: Yeman* Date: 2021-10-28-22:52* Description:*/ public class Labyrinth {public static void main(String[] args) {//七行八列的迷宫地图int[][] map new int[8][7];//设置墙for (int i 0; i < 7; i) {map[0][i] 1;map[7][i] 1;}for (int i 0; i < …

android动画优缺点,Android动画总结

动画分为三种&#xff1a;View动画、帧动画和属性动画View动画View动画共有四种动画&#xff1a;TranslateAnimation、RotateAnimation、ScaleAnimation和AlphaAnimation。四个动画类都继承于抽象类Animation。名称标签子类效果平移动画TranslateAnimation移动View缩放动画Scal…

Java实现递归回溯,解决八皇后问题,数据结构与算法

文章目录八皇后问题解决思路代码实现运行结果八皇后问题 八皇后问题&#xff0c;是一个古老而著名的问题&#xff0c;是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯贝瑟尔于1848年提出&#xff1a;在8X8格的国际象棋上摆放八个皇后&#xff0c;使其不能互相攻击&#x…

HTML JS正方形轮播,js,html一个页面里面多个页面轮播

这种轮播都是div或者图片的&#xff0c;div能换成iframe显示嵌套网页吗&#xff1f;或者请问有没有其他方法能实现多个页面轮播&#xff1f;我写了三个iframeframeborder"no" border"0" marginwidth"0" marginheight"0" scrolling&quo…

html制作任务计划列表网页,添加计划任务的脚本

在windows中怎样用bat或者vbs添加计划任务..例如.我想在每次开机10分钟后运行windows目录中的XX.exe文件。应该怎么弄写了一个bat的备份脚本&#xff0c;在添加计划任务的时候&#xff0c;出你可以把 运行的帐号制定成管理员&#xff0c;不要任意用户。200分。用批处理或DOS添加…

第一章MCS-51单片机结构,单片机原理、接口及应用

文章目录一、MCS-51单片机内部结构二、CPU三、存储器四、特殊功能寄存器SFR五、时钟电路与复位电路六、引脚功能一、MCS-51单片机内部结构 单片机是在一块芯中集成了CPU、RAM、ROM、定时/计数器和多功能I/O接口等基本部件的大规模集成电路&#xff0c;又称MCU。 51系列单片机…

微信小程序云开发校园社交二手物品跳蚤平台表白动态求助寻物组队

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记&#xff08;微信号csds99202…

传感与检测实验报告,差动变压器的特性测定,江南大学物联网自动化

前些天发现了十分不错的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; public class LeastSquares {public static void matching(…

如何使用Spring初始化程序创建Spring Boot项目

你好朋友&#xff0c; 如果您以前使用过Spring框架&#xff0c;则必须意识到&#xff0c;即使要开始使用基本的Spring功能也需要付出一些真正的努力。有了Spring Boot&#xff0c;最初的麻烦就消失了&#xff0c;您可以在数分钟内开始使用。 欢迎来到Spring Boot的世界&#…

计算机组成原理,计算机系统总线,总线分类、特性、性能指标、结构以及总线控制,判优控制通信控制

文章目录总线的基本概念总线的分类总线特性及性能指标总线结构总线控制一、总线判优控制二、总线通信控制总线的基本概念 一、总线是连接各个部件的信息传输线&#xff0c;是各个部件共享的传输介质。 二、总线上信息的传送有串行和并行&#xff1a; 三、总线结构计算机举例…

传感与检测技术,Pt100热电阻测温实验报告,江南大学物联网

public class LeastSquares {public static void matching(double[] x, double[] y, double[] input, double fully) {double k getK(x, y);double b getB(x, y);System.out.println("线性回归系数 k 值&#xff1a;\t" k "\n" "线性回归系数 b …