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;}}

此代码仅为个人见解,还需更改

分析约瑟夫问题(循环单链表)相关推荐

  1. 数据结构-循环单链表之约瑟夫问题

    约瑟夫问题的由来: 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定 ...

  2. 约瑟夫环问题---循环单链表

    约瑟夫环问题是比较经典的问题,原来做的题目是依次输出数字,而原来的循环链表结构不改变,今天遇到一道题是要求按照顺序重新组成一个循环单链表. 题目:一些人围坐一圈报数,形成一个循环单链表,当报数是m或m ...

  3. c语言循环单链表实现约瑟夫环问题

    题目: 约瑟夫(Joeph)问题的一种描述是:编号为1,2,-,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数).一开始任选一个正整数作为报数上限值max,从第一个人开始按顺时针方向自1开始 ...

  4. 循环单链表解决约瑟夫问题

     [问题描述] 约瑟夫(Joeph)问题的一种描述是:编号为1,2,-,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数).一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1 ...

  5. 第二章——单链表和循环单链表

    线性表--链表 顺序表需要事先占用一整块实现分配大小的存储空间,但是对于某些问题:很多空间只使用一次(甚至根本用不到),使用顺序表存储空间的利用率往往很低.于是需要一种能够动态管理存储空间的存储结构- ...

  6. 【数据结构】循环单链表的实现(C语言)

    循环单链表应掌握以下基本操作: 1.建立一个空的循环单链表. 2.获得循环单链表的最后一个结点的位置. 3.输出循环单链表中各结点的值. 4.在循环单链表中查找值为x的结点. 5.在循环单链表中第i个 ...

  7. 建立循环单链表(尾插法)

    循环链表的操作实现算法与非循环链表的操作算法基本相同,只是对表尾的判断做了改变. 定义单链表的存储结构: typedef struct LinkList{int data;LinkList * nex ...

  8. 建立循环单链表(头插法)

    循环链表的操作实现算法与非循环链表的操作算法基本相同,只是对表尾的判断做了改变. 定义单链表的存储结构: typedef struct LinkList{int data;LinkList * nex ...

  9. 【c++版数据结构】之循环单链表的实现(带头结点以及尾节点)

    所实现的循环单链表的结构例如以下图所看到的: 循环单链表的实现,和上一篇文章单链表的实现大致同样点击打开链接,略有差别: 1:循环推断的条件不再是s == NULL或者s->next == NU ...

最新文章

  1. Toolbar中menu菜单文字颜色的修改
  2. yum下载包保存到本地
  3. 使用Java调用以WSDL形式发布的web service
  4. java短横线转驼峰_Java后端常备的开发规范
  5. [基础题] * 9.(*)设计一个Student接口,以一维数组存储一个班级的学生姓名。
  6. Map集合转换成实体类对象,实体类对象转换为map集合,互转工具类
  7. Linux 挂载华为存储,linux扫描挂载存储
  8. VSZ、RSS、Pss的区别和含义
  9. hexo 环境变量_优雅的博客框架,快速、简洁、高效且主题丰富——Hexo
  10. mysql 去重命令_MySQL 命令操作
  11. 米家扫地机器人按键没反应_小米扫地机系统重置键在哪?
  12. [opencv]学习之帧差法实现运动物体检测
  13. 来!程序猿教你们玩微信代码~
  14. Linux系统中查看LWP(轻量级进程)、进程 、 线程的ID的方法
  15. 使用HTML及简单的JavaScript脚本制作一个点名器
  16. 今日头条笔试之字母交换
  17. 数据库实验-触发器实验
  18. Dz经典加密解密方法。
  19. 一个小游戏让你彻底弄懂墨卡托投影
  20. windows7下建行网银点支付后页面无法响应

热门文章

  1. 使用WampServer搭建本地PHP环境,绑定域名,配置伪静态
  2. MyEclipse解决Launching xx on MyEclipse Tomcat has encountered a problem
  3. bbmail-小巧的邮件提示程序
  4. # 秒转换成分钟_10分钟时间,我用Excel完成了别人一天的数据分析工作
  5. 开源版本_开源版本PowerShell Core 6.2 发布
  6. c语言微信昵称大全女生优雅经典的,微信昵称大全女生优雅_有深度有内涵的昵称...
  7. cwntos新建目录挂载磁盘_centos6修改挂载磁盘目录的方法
  8. IDM下载速度慢解决方案全网搜集持续更新
  9. mysql_upgrade --force_社区投稿 | MySQL 8.0.16 告别mysql_upgrade升级方式
  10. html float菜鸟,这些年,我们前端菜鸟遇到的坑(1)--CSS易错点--float、透明度、rem......