分析约瑟夫问题(循环单链表)
1.Josephu question:
设编号为1,2,3…n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列
2.思路
1.构成一个有n个节点的单循环链表
2.从第k个节点开始报数(k是第一个),当报的数等于m时停止,将该节点删除
3.从上一个删除节点的下一个节点继续报数,直到所有节点删除
3.代码实现方式1
package com.company;/*** @author:抱着鱼睡觉的喵喵* @date:2021/2/11* @description:*/
public class JosephDemo3 {public static void main(String[] args) {System.out.println("出列的顺序为:");new CircleSingleLinkedList().Joseph(2, 10, 5);}
}class CircleSingleLinkedList {private CircleNodes front; //指向循环链表的第一个节点,始终保持不变/***构建一个循环链表*@param nums 循环链表长度*/public void add(int nums) {if (nums < 1) {System.out.println("LinkedList is empty!");return;}CircleNodes cur = null;for (int i = 1; i <= nums; i++) {CircleNodes circleNodes = new CircleNodes(i);if (i == 1) {front = circleNodes;front.setNext(circleNodes);cur = circleNodes;} else {cur.setNext(circleNodes);circleNodes.setNext(front);cur = circleNodes;}}}/***核心函数* @param k 从第几个位置开始* @param m 数几个数* @param n 环形队列的长度*/public void Joseph(int k, int m, int n) {if (n < 1 || k < 1 || m < 1) {System.out.println("n或k或m不符合规则!");return;}add(n); //创建一个长度为n的循环链表CircleNodes cur = front;CircleNodes temp = front;while (cur.getNext() != front) { //将cur = cur.getNext();}for (int s = 1; s < k; s++) {cur = cur.getNext();temp = temp.getNext();}int nums = n;for (int i = 0; i < n; i++) {for (int j = 0; j < ((m - 1) % nums); j++) {cur = cur.getNext();temp = temp.getNext();}nums--;System.out.printf("%d->",temp.getSno());temp = temp.getNext();cur.setNext(temp);}}
}
//节点类
class CircleNodes {private int sno;private CircleNodes next;public CircleNodes getNext() {return next;}public void setNext(CircleNodes next) {this.next = next;}public CircleNodes(int sno) {this.sno = sno;}public int getSno() {return sno;}public void setSno(int sno) {this.sno = sno;}
}
4.代码实现方式2
package com.company;/*** @author:抱着鱼睡觉的喵喵* @date:2021/2/11* @description:*/
public class JosephDemo2 {public static void main(String[] args) {CircleNode2 circleNode = new CircleNode2(1);CircleNode2 circleNode2 = new CircleNode2(2);CircleNode2 circleNode3 = new CircleNode2(3);CircleNode2 circleNode4 = new CircleNode2(4);CircleLinkedList2 circleLinkedList2 = new CircleLinkedList2();circleLinkedList2.add(circleNode);circleLinkedList2.add(circleNode2);circleLinkedList2.add(circleNode3);circleLinkedList2.add(circleNode4);Joseph(1, 1, circleLinkedList2);}public static void Joseph(int k, int m, CircleLinkedList2 circleLinkedList2) {int length = circleLinkedList2.getLength();if (k <= 0 || m <= 0 || length <= 0) {System.out.println("k或m或链表长度不符合条件:(k>0 && m>0 && length>0)!");return;}CircleNode2 head = circleLinkedList2.front;int nums = 0;CircleNode2 cur = circleLinkedList2.front;while (nums != k - 1) {nums++;cur = cur.next;}CircleNode2 pNode = circleLinkedList2.front;for (int j = 0; j < k - 2; j++) {pNode = pNode.next;}for (int i = 0; i < length; i++) {nums = 0;while (nums != m - 1) {nums++;pNode = pNode.next;cur = cur.next;}System.out.printf("%d->", cur.sno);pNode.next = cur.next;cur = cur.next;}}
}class CircleNode2 {public int sno;public CircleNode2 next;public CircleNode2(int sno) {this.sno = sno;}
}class CircleLinkedList2 {CircleNode2 front;CircleNode2 cur;public void add(CircleNode2 node) {if (front == null) {front = node;node.next = node;cur = node;} else {cur.next = node;node.next = front;cur = node;}}public void list() {if (front == null) {System.out.println("LinkedList is empty!");return;}System.out.println(front);CircleNode2 temp = front.next;while (temp != front) {System.out.println(temp);temp = temp.next;}}public int getLength() {int nums = 0;if (front == null) {return nums;}nums++;CircleNode2 temp = front;while (temp.next != front) {nums++;temp = temp.next;}return nums;}}
此代码仅为个人见解,还需更改
分析约瑟夫问题(循环单链表)相关推荐
- 数据结构-循环单链表之约瑟夫问题
约瑟夫问题的由来: 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定 ...
- 约瑟夫环问题---循环单链表
约瑟夫环问题是比较经典的问题,原来做的题目是依次输出数字,而原来的循环链表结构不改变,今天遇到一道题是要求按照顺序重新组成一个循环单链表. 题目:一些人围坐一圈报数,形成一个循环单链表,当报数是m或m ...
- c语言循环单链表实现约瑟夫环问题
题目: 约瑟夫(Joeph)问题的一种描述是:编号为1,2,-,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数).一开始任选一个正整数作为报数上限值max,从第一个人开始按顺时针方向自1开始 ...
- 循环单链表解决约瑟夫问题
[问题描述] 约瑟夫(Joeph)问题的一种描述是:编号为1,2,-,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数).一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1 ...
- 第二章——单链表和循环单链表
线性表--链表 顺序表需要事先占用一整块实现分配大小的存储空间,但是对于某些问题:很多空间只使用一次(甚至根本用不到),使用顺序表存储空间的利用率往往很低.于是需要一种能够动态管理存储空间的存储结构- ...
- 【数据结构】循环单链表的实现(C语言)
循环单链表应掌握以下基本操作: 1.建立一个空的循环单链表. 2.获得循环单链表的最后一个结点的位置. 3.输出循环单链表中各结点的值. 4.在循环单链表中查找值为x的结点. 5.在循环单链表中第i个 ...
- 建立循环单链表(尾插法)
循环链表的操作实现算法与非循环链表的操作算法基本相同,只是对表尾的判断做了改变. 定义单链表的存储结构: typedef struct LinkList{int data;LinkList * nex ...
- 建立循环单链表(头插法)
循环链表的操作实现算法与非循环链表的操作算法基本相同,只是对表尾的判断做了改变. 定义单链表的存储结构: typedef struct LinkList{int data;LinkList * nex ...
- 【c++版数据结构】之循环单链表的实现(带头结点以及尾节点)
所实现的循环单链表的结构例如以下图所看到的: 循环单链表的实现,和上一篇文章单链表的实现大致同样点击打开链接,略有差别: 1:循环推断的条件不再是s == NULL或者s->next == NU ...
最新文章
- Toolbar中menu菜单文字颜色的修改
- yum下载包保存到本地
- 使用Java调用以WSDL形式发布的web service
- java短横线转驼峰_Java后端常备的开发规范
- [基础题] * 9.(*)设计一个Student接口,以一维数组存储一个班级的学生姓名。
- Map集合转换成实体类对象,实体类对象转换为map集合,互转工具类
- Linux 挂载华为存储,linux扫描挂载存储
- VSZ、RSS、Pss的区别和含义
- hexo 环境变量_优雅的博客框架,快速、简洁、高效且主题丰富——Hexo
- mysql 去重命令_MySQL 命令操作
- 米家扫地机器人按键没反应_小米扫地机系统重置键在哪?
- [opencv]学习之帧差法实现运动物体检测
- 来!程序猿教你们玩微信代码~
- Linux系统中查看LWP(轻量级进程)、进程 、 线程的ID的方法
- 使用HTML及简单的JavaScript脚本制作一个点名器
- 今日头条笔试之字母交换
- 数据库实验-触发器实验
- Dz经典加密解密方法。
- 一个小游戏让你彻底弄懂墨卡托投影
- windows7下建行网银点支付后页面无法响应
热门文章
- 使用WampServer搭建本地PHP环境,绑定域名,配置伪静态
- MyEclipse解决Launching xx on MyEclipse Tomcat has encountered a problem
- bbmail-小巧的邮件提示程序
- # 秒转换成分钟_10分钟时间,我用Excel完成了别人一天的数据分析工作
- 开源版本_开源版本PowerShell Core 6.2 发布
- c语言微信昵称大全女生优雅经典的,微信昵称大全女生优雅_有深度有内涵的昵称...
- cwntos新建目录挂载磁盘_centos6修改挂载磁盘目录的方法
- IDM下载速度慢解决方案全网搜集持续更新
- mysql_upgrade --force_社区投稿 | MySQL 8.0.16 告别mysql_upgrade升级方式
- html float菜鸟,这些年,我们前端菜鸟遇到的坑(1)--CSS易错点--float、透明度、rem......