Java 约瑟夫 作者:哇塞大嘴好帥(哇塞大嘴好帅)

作者:哇塞大嘴好帥(哇塞大嘴好帅)

0.Josephu(约瑟夫) 分析

​ 设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,倒数m的那个人出列,他的下一位又从1开始报数,疏导m那个人又出列

​ 假设:

​ n = 6 有6个人

​ n = 1 从第一个人开始报数

​ m = 2 数两下

环形链表思路

​ 1.创建第一个节点,让first指向当前节点,形成环形链表

​ 2.创建一个新的节点,就把该节点加入到已有的环形链表中即可。

遍历思路

​ 1.先让一个复制指针(变量)curBoy,指向first节点。

​ 2.通过while循环遍历该链表 ,如果curBoy.next == first 就代表遍历结束

1.先创建一个类表示一个节点

/*** 节点*/
class Node{private int no;//编号@Overridepublic String toString() {return "Node{" +"no=" + no;}public int getNo() {return no;}public void setNo(int no) {this.no = no;}public Node getNext() {return next;}public void setNext(Node next) {this.next = next;}public Node(int no) {this.no = no;}private Node next;//指向下一个节点 默认为NULL
}

2.约瑟夫 - 增

//创建头节点 永远指向第一个节点
private Node head = new Node(-1);
//创建临时指针,帮助实现环形链表  temp永远指向最新添加的一个节点
Node temp = null;//添加节点
public void add(Node node){//如果是第一个节点if (head.getNext() == null){head = node;head.setNext(head);temp = head;}else{//System.out.println(temp);temp.setNext(node);node.setNext(head);temp = node;}
}

​ 首先创建一个头节点,这个头节点会一直指向第一个节点,接下来创建一个临时指针(变量) ,这个临时变量永远在链表的最新添加的一个节点的位置,

​ 接下来判断添加的位置是否为第一个节点,如果头节点的下一个节点为空,就代表头节点没有数据,我们只需要把第一个节点赋值给头节点即可,头节点的下一个节点等于头节点,temp永远在新加入的节点。

​ 如果不是第一个节点就 链表中的最后一个节点的下一个节点指向新插入的节点新插入的节点的下一个指向头节点,然后在把新的节点赋值给temp,因为temp要一直指向链表中新添加的节点。

3.约瑟夫 - 查

//创建头节点 永远指向第一个节点
private Node head = new Node(-1);
//创建临时指针,帮助实现环形链表  temp永远指向最后一个节点
Node temp = null;//遍历节点
public void selectNode(){//如果链表没有节点if (head == null){System.out.println("链表没有数据");return;}//创建临时指针(变量)temp = head;//while循环遍历while (true){System.out.println(temp);if (temp.getNext() == head){System.out.println("遍历结束");break;}//指针下移temp  = temp.getNext();}
}

​ 首先判断链表中有没有节点,如果头节点的下一个节点 == null 就代表当前链表中没有元素,接下来创建一个临时变量,通过while循环遍历,如果当前节点的下一个节点等于头节点就代表遍历结束。

​ 接来来打印数据,指针下移, 指针下移就是指向当前元素的下一个。

4.约瑟夫-依次出列

/*** 出列* @param start  开始出列的位置* @param count  步数  隔着几个节点出列**/
public void getMember(int start,int count) throws InterruptedException {// 有多少个节点在圈中int nums = validmenber();/*** 对数据进行校验*      1. 如果head == null 就说明链表没有数据*      2. start < 0 因为只能从1个以上的开始数第几个,不能数第-1个*      3. start > nums 如果链表有5个节点 你不能从第6个开始数*/if (head == null || start < 0 || start > nums){System.out.println("参数有错误,请重新输入 ");}//创建辅助指针,帮助节点出列. 指向最后一个节点Node foot = head;//让foot指向链表最后一个节点while(true){if (foot.getNext() == head){break;}else{foot = foot.getNext();}}//在列出队列前先让head和foot移动k-1次for (int i = 0; i < start - 1 ; i++) {head = head.getNext();foot = foot.getNext();}//开始列出数组while (true){//当前链表就剩下一个数据if (foot == head){System.out.println("弹出的数据"+head);head = null;return;}//找到隔着的第N个节点for (int i = 0; i < count - 1 ; i++) {head = head.getNext();foot = foot.getNext();}System.out.println("弹出的数据"+head);head = head.getNext();foot.setNext(head);}
}//查询有效数据public int validmenber(){//如果链表没有节点if (head == null){System.out.println("链表没有数据");return 0;}//创建临时变量 遍历遍历Node temp = head;//记录有效数据个数int conut = 1;while (true){if (temp.getNext() == head){System.out.println("有效数据个数"+conut);return conut;}conut++;temp = temp.getNext();}}

​ 首先看 int nums = validmenber();获取当前链表的有效节点个数,在看validmenber()方法,原理跟约瑟夫 - 查 一致,就是做了一些修改,在没有遍历之间创建了一个conut用于记录数据个数。如果当前节点的下一个是第一个节点(第一个节点指的是head),就代表遍历结束。

接下里对数据进行校验

  1. 如果head == null 就说明链表没有数据
  2. start < 0 因为只能从1个以上的开始数第几个,不能数第-1个
  3. start > nums 如果链表有5个节点 你不能从第6个开始数

接下来创建一个临时遍历(指针) foot,这个指针(遍历)永远指向最后一个数据,通过While循环将foot指向了最后一个节点。因为如果当前节点的下一个节点等于第一个节点就代表链表后没有数据了。

​ 接下来要让temp还有foot全部后移动 start - 1 次,因为我们要从第start节点开始报数。关于为什么是 start - 1 是因为自己也要报数,自己也算一个人,详情在下方图片

​ 经过以上图片对比我们可以发现 start - 1是从自身开始数2个节点。start是不算自身开始数2个。我们想要的肯定是从自身开始数,因为他自己也算个人,所以要后移start - 1

​ 接下来进入while循环,如果foot == head就代表链表已经遍历完毕,进入此循环打印最后一个节点,接下来再把节点设置为NULL,结束循环,详细会在后面解图显示。

​ 接下来查找与temp隔着count个位置的节点,此步骤原理和头节点尾节点后移原理一样,此步骤移动tempfoot节点,因为要从start - 1后的count - 1开始数进行出列操作。

接下来我们要做出列工作(将此节点在链表删除) 首先我们要让头节点下移动一位,在将foot节点的next 指向头节点,这样就可以删除当前节点了。

Java数据结构-约瑟夫 作者:哇塞大嘴好帥(哇塞大嘴好帅)相关推荐

  1. Java数据结构链表面试题 作者:哇塞大嘴好帥(哇塞大嘴好帅) --持续更新

    作者:哇塞大嘴好帥(哇塞大嘴好帅) Java数据结构链表面试题 4.1.查询链表有效数据个数 //判断有效数据个数 public int validDate(){//创建临时变量NodeDate no ...

  2. Mysql数据库常用类型 作者:哇塞大嘴好帥(哇塞大嘴好帅)

    Mysql数据库常用类型 作者:哇塞大嘴好帥(哇塞大嘴好帅) 作者:哇塞大嘴好帥(哇塞大嘴好帅) 1.基本数据类型 数值 tintint 特别小的数据 只占一个字节 smalint 较小的数据 只占2 ...

  3. Redis集群-主从复制 作者哇塞大嘴好帥(哇塞大嘴好帅)

    1.Redis集群 - 主从复制 作者:哇塞大嘴好帥(哇塞大嘴好帅) 主从复制 1.概念 讲一台Redis服务器数据复制到其他Redis服务器.被复制的服务器叫做主节点,复制被复制的服务器数据叫做从节 ...

  4. Spring Boot 整合Redis 包含Java操作Redis哨兵 作者:哇塞大嘴好帥(哇塞大嘴好帅)

    Spring Boot 整合Redis 包含Java操作Redis哨兵 作者:哇塞大嘴好帥(哇塞大嘴好帅) 1. 配置环境 在SpringBoot2.0版本以后,原来使用的jedis被替换成为了let ...

  5. Redis 持久化 v1.0 文章作者:哇塞大嘴好帥(哇塞大嘴好帅)

    Redis 持久化 作者:哇塞大嘴好帥(哇塞大嘴好帅) 1.RDB (Redis DataBase) ​ Redis是内存数据库,如果不能将内存中的数据库保存到硬盘,那么一旦退出或者机房断电等症状,数 ...

  6. 对话《深入理解Java虚拟机》作者周志明:电竞选手成为Java大神之路

    声明:本文由"阿里云MVP团队"原创,转载经"阿里云开发者社区"授权.原文标题:<职业电竞选手的Java大神路:对话阿里云MVP周志明>. 销售超过 ...

  7. java队列_如何彻底搞懂 Java 数据结构?CSDN 博文精选

    作者 | 张振华.Jack 责编 | 郭芮 出品 | CSDN 博客 本文和大家一起来重温<Java数据结构>经典之作. Java数据结构 要理解Java数据结构,必须能清楚何为数据结构? ...

  8. Java数据结构和算法(一)——简介

    本系列博客我们将学习数据结构和算法,为什么要学习数据结构和算法,这里我举个简单的例子. 编程好比是一辆汽车,而数据结构和算法是汽车内部的变速箱.一个开车的人不懂变速箱的原理也是能开车的,同理一个不懂数 ...

  9. java 固定长度队列_如何彻底搞懂 Java 数据结构?|CSDN 博文精选

    作者 | 张振华.Jack 责编 | 郭芮 出品 | CSDN 博客 本文和大家一起来重温<Java数据结构>经典之作. Java数据结构 要理解Java数据结构,必须能清楚何为数据结构? ...

最新文章

  1. mac平台反编译apk,获取源码,androidmanifest和资源文件
  2. 使用Response.ContentType 来控制下载文件的类型
  3. Microsoft Office相关开发组件
  4. vue中央事件总线eventBus的简单理解和使用
  5. C#String详解
  6. pytorch: 在训练中保存模型,加载模型
  7. 通过命令行新建qt项目,并编译打包
  8. Jeecg-Boot 1.0 版本发布,基于SpringBoot+Mybatis+AntDesign快速开发平台
  9. 初识多线程之基础知识与常用方法
  10. 机器学习模型可解释性进行到底 ——PDPICE图(三)
  11. php处理ubb代码,UBB代码详解
  12. 怎样用UE4把一个Actor直接打包成Pak
  13. python 爬虫入门(3) proxy详解 代理详解
  14. js实现添加删除表格
  15. 计算机无法读光盘,win7系统无法读取光盘数据怎么办 电脑光驱读不出光盘数据解决方法...
  16. java实现图片上传后裁剪,把白色背景变成透明图(电子印章)
  17. 二维几何图形创作方法(Geometry2D)
  18. Webpack 中 CSS 压缩插件
  19. 服务器知识:什么是云服务器、VPS、高防服务器、国外服务器
  20. 小说《小城恋情》第三十三章

热门文章

  1. JAVA基础-jdk和jre的关系和区别
  2. 字节跳动、学而思纷纷进场,线上自习室2021更火了?
  3. android命令抹机原理,[原创]利用xhook安卓系统底层抹机原理
  4. 检测com类中CLSID为{F9364159-6AED-4F9C-8BAF-D7C7ED6160A8}的组件时失败,错误80040154
  5. mysql 可变字符串_MySQL:字符串类型
  6. java将jlist设置为只能单选,【判断题】JList可以实现列表框功能。 A. 正确 B. 错误...
  7. java实现阿里云云通信短信通知发送
  8. 使用闪库内网穿透(即本机地址实现外网域名访问)
  9. java低层源码_如何查看javaJDK中底层源码
  10. 基于java的电子健康档案管理系统