链表引用——约瑟夫问题

news/2024/11/17 16:29:24/文章来源:https://www.cnblogs.com/wdh01/p/17557491.html

约瑟夫问题

Josephu问题为:设编号为1,2,...n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。提示:用一个不带头结点的循环链表来处理Josephu问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束。

参考实现

/*** 约瑟夫环*/
public class Josepfu {public static void main(String[] args) {CircleSingleLinkeList c = new CircleSingleLinkeList();c.addNode(5);c.show();c.roundBoy(1,2,5);}
}/****/
class CircleSingleLinkeList {//创建 first 节点private Boy first = new Boy(-1);/*** 构建环形链表** @param num*/public void addNode(int num) {if (num < 1) {System.out.println("输入错误");return;} else {Boy curBoy = null;for (int i = 1; i <= num; i++) {//根据编号,创建节点Boy boy = new Boy(i);//第一个boy 特殊处理if (i == 1) {first = boy;first.setNext(first); //构成环形curBoy = first;} else {curBoy.setNext(boy);boy.setNext(first);curBoy = boy;}}}}/*** 遍历环形链表*/public void show() {if (first == null) {System.out.println("空空");return;} else {Boy curBoy = first;while (true) {System.out.println("编号- " + curBoy.getId());if (curBoy.getNext() == first) {//遍历完成break;} else {//curBoy 后移curBoy = curBoy.getNext();}}}}/*** Josepfu 出队顺序** @param starId   表示从第几个Boy开始* @param countNum 步长* @param total    总数*/public void roundBoy(int starId, int countNum, int total) {//前置判断if (first == null || starId < 1 || starId > total) {System.out.println("参数有误");} else {//创建辅助节点Boy helper = first;while (true) {if (helper.getNext() == first) {//helper 此时是最后一个节点break;} else {//helper 后移helper = helper.getNext();}}//报数前,先让 first & helper 移动 k - 1 次for (int i = 0; i < starId - 1; i++) {first = first.getNext();helper = helper.getNext();}//当小孩报数时,让 first & helper 同时移动 m -1次,然后出圈//这里是一个循环操作,直到只剩一个节点while (true) {if (helper == first) {//只有一个节点break;} else {for (int i = 0; i < countNum - 1; i++) {first = first.getNext();helper = helper.getNext();}//此时 first 指向的节点,即将出圈System.out.println(first.getId() + " 将出圈");//更改指向,使其出圈first = first.getNext();helper.setNext(first);}System.out.println("圈中还有 " + helper.getId());}}}}/*** 小孩类*/
class Boy {private int id;private Boy next;//指向下一个节点;默认 nullpublic int getId() {return id;}public void setId(int id) {this.id = id;}public Boy getNext() {return next;}public void setNext(Boy next) {this.next = next;}public Boy(int id) {this.id = id;}
}

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

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

相关文章

LogRotate 切割 Nginx 日志

发布于 2023-12-04 10:20:327140举报文章被收录于专栏:码农UP2U一直以来做日志切割都是使用 shell + crontab 来搞,shell 脚本可以在网上找到各种版本的,改改就用了,懒省事。这样的做法很传统,却忽略了系统的给我们提供的优秀的工具 —— logrotate。 一、Logrotate 是什么…

SQL Server中Upsert的三种方式(转载)

本文介绍了SQL Server中Upsert的三种常见写法以及他们的性能比较。SQL Server并不支持原生的Upsert语句,通常使用组合语句实现upsert功能。假设有表table_A,各字段如下所示:int型Id为主键。方法1:先查询,根据查询结果判断使用insert或者updateIF EXISTS (SELECT 1 FROM ta…

2024/7/15 模拟赛 记录

noip NOI plus!几乎全员爆蛋( 本来能拿T1 20pts 暴力分的,但是居然CE了!!! max里两个参数,一个int一个longlong dev居然没报!!!光荣爆蛋(我估计是全场唯一一个没过编的:( 题解已存至网盘 https://fzoishare.xndxfz.com:7123/

[考试记录] 2024.7.15 csp-s模拟赛4

2024.7.15 csp-s模拟赛4 T1 传送带 题面翻译 有一个长度为 \(n\) 的一维网格。网格的第 \(i\) 个单元格包含字符 \(s_i\) ,是“<”或“>”。当弹球放在其中一个格子上时,它会按照以下规则移动: 如果弹球位于第 \(i\) 个格子上且 \(s_i\) 为 <,则弹球在下一秒会向左…

图论连通性

【学习笔记】图论连通性啊啊啊啊啊! 先引用一篇犇的:))) 缩点 弱连通: 对于有向图中两点 \(x\) 和 \(y\),它们在所有边为无向时存在一个环使它们相连。 强连通: 对于有向图中两点 \(x\) 和 \(y\),存在一个环使它们相连。 强连通子图: 对于有向图 \(G = (V, E)\),如果…

CS144 2024 winter 作业笔记

CS144 2024 winter 作业笔记 cs144 homework notes Created: 2024-05-14T10:24+08:00 Published: 2024-07-15T20:16+08:00 Categories: ComputerNetwork 目录checkpoint0配环境wegetreliable byte stream疑问checkpoint1checkpoint2bugs:checkpoint3model of input_Sendertimer…

解锁网络无限可能:揭秘微软工程师力作——付费代理IP池深度改造与实战部署指南

"揭秘微软工程师力作:付费代理IP池深度改造,四大模块精讲,含实战部署指南。掌握高效、稳定代理IP资源,解锁网络无限可能。从筛选管理到安全加密,详细步骤助您快速搭建专属代理网络。尊享付费阅读,获取深度技术洞察与实践指导。"基于付费代理的代理IP池 项目来源…

SpringIOC 容器

SpringIOC 容器 一、组件的概念 什么是组件? 常规的三层架构处理请求流程:划分为组件后:组件就是所有可以重用的java对象,组件一定是对象,对象不一定是组件二、Spring 进行组件管理 Spring框架替代了程序员原有的new对象和对象属性赋值的动作组件对象实例化组件属性赋值组…

javap和字节码

javap字节码的基本信息public class Test {private int age = 10;public int getAge() {return age;} }在 class 文件的同级目录下输入命令 javap -v -p Test.class 来查看一下输出的内容// 字节码文件的位置 Classfile /D:/Code/code/JavaCode/JavaSourceLearn/out/production…

Prometheus之钉钉

要实现Prometheus通过Alertmanager发送告警到钉钉,您可以按照以下步骤进行配置:创建钉钉机器人:首先,您需要在钉钉群中添加一个自定义机器人,并获取机器人的Webhook地址。创建机器人时,您可以设置安全验证方式,如加签。创建完成后,保存好Webhook地址和加签后的秘钥(如…

Java——N以内累加求和

2024/07/15 1.题目 2.错误 3.分析 4.答案 1.题目2.错误 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int N = scanner.nextInt();int sum = 0;while (N<=1000) {for (int i=1;i<=N;…

SQLCoder部署和应用

SQLCoder文生SQL部署和应用主页个人微信公众号:密码应用技术实战 个人博客园首页:https://www.cnblogs.com/informatics/SQLCoder简介 SQLCoder是一个用于生成SQL语句的工具,可以通过输入自然语言描述的需求,生成对应的SQL语句。SQLCoder支持连接数据库,对生成的SQL语句可…