简洁明了!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数组模拟栈以实现中缀表达式综合计算器,字符串表达式计算器

文章目录数组模拟栈类中缀表达式计算器类&#xff08;测试类&#xff09;数组模拟栈类 主要实现栈的一些基本功能&#xff0c;以及在该场景下的功能。 //先创建一个栈 class AStack {private int maxSize; //栈的大小private int[] stack; //数组模拟栈private int top -1; …

android webview javascript不执行,WebView中的JavaScript为什么不执行?

浏览器未开启javascript使用的js代码有问题&#xff0c;webview不兼容该代码。1) 第一个坎&#xff1a;WebSettingsWebSettings webSettings mWebView.getSettings();webSettings.setJavaScriptEnabled(true);2) 第二个坎&#xff1a; 有物在运行脚本前&#xff0c;要有docume…

中缀转后缀表达式,带括号的后缀表达式综合计算器,Java栈数据结构实现

文章目录中缀表达式转后缀表达式思路逆波兰表达式计算思路代码实现中缀表达式转后缀表达式思路 1、初始化两个栈&#xff1a;运算符栈s1和储存中间结果的栈s2 2、从左至右扫描中缀表达式 3、遇到操作数时&#xff0c;将其压入s2 4、遇到运算符时&#xff0c;比较其与s1栈顶…

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 11将包含更多功能

Java 11中即将推出的功能是什么&#xff1f;它与Java 9和10有何不同&#xff1f; Java 10可能是新手&#xff0c;但现在该谈论Java 11了。Oracle迈向更快的发布周期意味着更多的特性和功能以比以往更快的速度出现。 尽管距离Java 11发行还有六个月的时间&#xff0c;但我们已…

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在screen检索屏幕分辨率,Electron开发之screen模块-根据屏幕分辨率设置窗口大小...

使用 Electron screen 模块可对屏幕进行相关操做screen 模块检索屏幕的 size&#xff0c;显示&#xff0c;鼠标位置等的信息,在 app 模块的ready 事件触发以前不可以使用这个模块.html注意: 在渲染进程 / 开发者工具栏, window.screen 是一个预设值的 DOM 属性, 因此这样写 var…

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

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

使用Travis-CI的SpringBoot应用程序的CI / CD

在本文中&#xff0c;我们将学习如何将Travis CI用于SpringBoot应用程序的持续集成和持续部署&#xff08;CI / CD&#xff09;。 我们将学习如何运行Maven构建目标&#xff0c;使用JaCoCo插件&#xff0c;使用SonarCloud代码质量检查&#xff0c;建立泊坞窗图像进行测试覆盖率…