11、java环形单链表解决约瑟夫问题
环形单向链表:守卫连接的一个单向链表,每个节点中有其变量和一个指针指向下一个节点。头节点可有可无,此处写的没有头节点。
创建,先创建一个没有数据的first节点表示整个链表的第一个节点
添加,此处的添加与之前的不同,这里的每个节点比较简单且无顺序可言,可直接生成环形链表而非和之前一样一个个添加。所以此处传入函数的参数为节点个数,用for循环生成循环单链表。其中生成第一个节点时需要把first节点的数据替换掉,因此在i=1的时候需要额外判断一步将生成的新节点替换掉first中的无数据。并将next连到自己身上,并将temp赋值first。其他的节点只需生成新节点后将其赋值给temp的next并将新节点的next连到第一个节点即可,最后也要将temp后移、
public void add(int n){
if(n<2){
System.out.println("人数太少");
return;
}
Boy temp=null;
for (int i=1;i<=n;i++){ Boy boy=new Boy(i);
if(i==1){
first=boy;
first.next=first;
temp=first;
}else {
temp.next=boy;
boy.next=first;
temp=temp.next;
}
}
}
遍历,判断链表不为空后利用辅助节点等于first开始不断后移遍历,辅助节点为最后一个时结束遍历
其中,辅助节点temp.next=first时temp为最后一个节点,first,next=null时链表为空
public void list(){
if(first.next==null){
System.out.println("链表为空");
}
Boy temp=first;
while (true){
System.out.println(temp.no);
if(temp.next==first) break;
temp=temp.next;
}
}
Josephu(约瑟夫、约瑟夫环)问题
Josephu问题为: 设编号为1,2,.. n的n个人围坐一-圈,约定编号为k (1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。
思路:设置一个helper变量,指向first的后一个即链表的最后一个节点。helper节点用while函数使其指向链表中的最后一个节点,即当其next为first时它为最后一个节点。
因为要从编号n开始数,数k下,所以这个函数需要的参数有startno(开始报数的编号)、countnum(报的数字)、nums(总的节点数)
需要在最开始检查几个变量的合理性,我自己写的时候虽然不影响整体结果但漏考虑了几种条件。老师此处的判断有如下几个:链表为空,开始编号小于1,开始编号大于总数
先将helper和first共同后移countnum-1个,让first到达开始报数的位置,接下来的程序都是重复的程序,不断找出一个个节点将其踢出链表。所以此处用一个while函数编写,其中包含了几个步骤:
1、设置跳出函数的判断条件,当链表中只剩一个节点时,跳出while循环,即first=helper时跳出循环。
2、以for循环不断报数,让helper和first后移countnum个,此时first指的节点便为要踢出链表的节点。这里我们让first再往后移一次,则现在要删除的节点位于helper和first之间,此时让first与helper连起来即可。
代码如下:
public void count(int startNo,int countNum,int nums){
if(nums<1||nums<startNo||first==null||startNo<1){
System.out.println("数据输入有误");
return;
}
Boy helper=first;
while (true){
if(helper.next==first) break;
helper=helper.next;
}
for (int i=0;i<startNo-1;i++){
helper=helper.next;
first=first.next;
}
while(true){
if(first==helper){
break;
}
for (int i=0;i<countNum-1;i++){
helper=helper.next;
first=first.next;
}
System.out.println(helper.next.no);
first=first.next;
helper.next=first; }
System.out.println(first.no);
}
其实这个问题并不难,用数组等方法也可以轻松做出来。但以此方法一个是了解了链表中的环形链表的结构和创建方式,另一个也是学到了其的应用。
11、java环形单链表解决约瑟夫问题的更多相关文章
- PHP算法学习(8) 环形链表 解决约瑟夫问题
2019年2月25日17:29:17 Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓.于是决定了自杀方式,41个人排成一个圆圈 ...
- 数据结构——Java实现单链表
一.分析 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点由元素和指针构成.在Java中,我们可以将单链表定义成一个类,单链表的基 ...
- JAVA数据结构——单链表
链表:一. 顺序存储结构虽然是一种很有用的存储结构,但是他有如下几点局限性:1. 因为创造线性表的时候已经固定了空间,所以当需要扩充空间时,就需要重新创建一个地址连续的更大的存储空间.并把原有的数据元 ...
- 使用java实现单链表(转载自:https://www.cnblogs.com/zhongyimeng/p/9945332.html)
使用java实现单链表----(java中的引用就是指针)转载自:https://www.cnblogs.com/zhongyimeng/p/9945332.html ? 1 2 3 4 5 6 7 ...
- Java实现单链表的各种操作
Java实现单链表的各种操作 主要内容:1.单链表的基本操作 2.删除重复数据 3.找到倒数第k个元素 4.实现链表的反转 5.从尾到头输出链表 6.找到中间节点 7.检测链表是否有环 8.在 ...
- java实现单链表的增删功能
JAVA 实现单链表的增删功能 package linked; class LinkedTable{ } public class LinkedTableTest { public static vo ...
- php实现单,双向链表,环形链表解决约瑟夫问题
传智播客PHP学院 韩顺平 PHP程序员玩转算法第一季 http://php.itcast.cn 聊天篇: 数学对我们编程来说,重不重要? 看你站在什么样的层次来说. 如果你应用程序开发,对数学要求 ...
- 用Java实现单链表的基本操作
笔试题中经常遇到单链表的考题,下面用java总结一下单链表的基本操作,包括添加删除节点,以及链表转置. package mars; //单链表添加,删除节点 public class ListNode ...
- java实现单链表常见操作
一.概述: 本文主要总结单链表常见操作的实现,包括链表结点添加.删除:链表正向遍历和反向遍历.链表排序.判断链表是否有环.是否相交.获取某一结点等. 二.概念: 链表: 一种重要的数据结构,HashM ...
- Java实现单链表的快速排序和归并排序
本文描述了LeetCode 148题 sort-list 的解法. 题目描述如下: Sort a linked list in O(n log n) time using constant space ...
随机推荐
- Swagger2多包扫描
package com.xf.config; import org.springframework.context.annotation.Bean; import org.springframewor ...
- java反序列化基础
前言:最近开始学习java的序列化与反序列化,现在从原生的序列化与反序列化开始,小小的记录一下 参考文章:https://blog.csdn.net/mocas_wang/article/detail ...
- vivo 自研Jenkins资源调度系统设计与实践
作者:vivo 互联网服务器团队- Wu Qinghua 本文从目前业界实现Jenkins的高可用的实现方案,分析各方案的优缺点,引入vivo目前使用的Jenkins高可用方案,以及目前Jenkins ...
- xmind使用分享
Xmind 介绍 1. 特点 是表达发散性思维的有效工具,图文并重,把各主题的隶属关系和相关的层级表现出来,把关键字与图像,文字,颜色建立起链接记忆. 2.安装,下载与破解 参考:https://bl ...
- Android:遍历视图
<LinearLayout android:id="@+id/ques2_layout" android:layout_width="match_parent&qu ...
- Optimum + ONNX Runtime: 更容易、更快地训练你的 Hugging Face 模型
介绍 基于语言.视觉和语音的 Transformer 模型越来越大,以支持终端用户复杂的多模态用例.增加模型大小直接影响训练这些模型所需的资源,并随着模型大小的增加而扩展它们.Hugging Face ...
- 22 备份整合方案应用:Proxmox BS
22 备份整合方案应用:Proxmox BS 22.1 深度整合备份解决方案 在PVE所内建的备份功能,当我们备份至本机路径(Directory).NFS/CIFS挂接的网路储存装置时,它每一次所做的 ...
- Xilinx XPM使用说明--XPM_MEMORY_SDPRAM
XPM_MEMORY_SDPRAM 参数化宏:简单的双端口RAM 介绍 此宏用于实例化简单双端口RAM.端口A用于从存储器执行写入操作,端口B可用于从存储器读取. 下面介绍XPM_MEMORY实例的基 ...
- 银河麒麟服务器V10-SP2安装tomcat
1.首先先去tomcat官网下载一个安装包 2.创建一个存放压缩包的文件夹,并考入文件 3.解压tomcat压缩包 命令: tar -xvf 压缩包名 4.启动tomcat 进入apache-tomc ...
- Linux命令执行时,提示commond not found的处理办法
执行chattr命令时,或其他命令时,若出现命令没发现,commond not found 那么就是有可能命令文件丢了,执行find / -name chattr,如果没有命令了,可以拷贝一个或yum ...