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. 【Linux学习】epoll详解
  2. 前端性能优化:当页面渲染遇上边缘计算
  3. 分布式文件系统研究-测试-文件下载测试
  4. 在sts中springboot工程的maven解析异常处理
  5. 微型计算机一般不采用的控制方式,微型计算机控制作业.doc
  6. 布朗桥python_MATLAB 里面有哪些加快程序运行速度的方法呢,求分享?
  7. Visual Studio生成汇编列表文件(listing file)
  8. 阿里 mysql cluster_MySQL Cluster集群安装及使用-阿里云开发者社区
  9. js获取今天剩余时间_js动画,setTimeout/setInterval的不准确
  10. 网站服务器系统组成,linux系统由哪几部分组成_网站服务器运行维护,linux
  11. c++常用代码(持续更新)
  12. 为何电脑系统相对通用而手机却相对定制
  13. 如何降低IE安全级别
  14. c语言旅馆信息管理系统,C语言旅馆信息管理系统
  15. 计算机用户密码查看器,电脑开机密码查看工具
  16. Junit - Eclipse 教程
  17. 微信小程序测试点分类和总结
  18. 教你这么理解 『假脱机打印机系统』
  19. 人工智能+大数据+云计算
  20. linux 下 .o 文件, .a文件,.so文件的区别

热门文章

  1. Android应用开发提高系列(4)——Android动态加载(上)——加载未安装APK中的类...
  2. loj 1210 (求最少的加边数使得图变成强连通)
  3. SVN 版本服务器搭配全过程详解(服务端、客户端)[转]
  4. Javascript 本地图片预览
  5. [转载]ASP.NET开发经验积累
  6. linux修改重传次数,聊一聊重传次数
  7. python找不到os模块_python之os模块
  8. python socket 书籍_Python学习之路——socket
  9. 化工设备与反应器 第三章 直梁的弯曲
  10. React  学习第一天-2018-07-21