环形单向链表:守卫连接的一个单向链表,每个节点中有其变量和一个指针指向下一个节点。头节点可有可无,此处写的没有头节点。

创建,先创建一个没有数据的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环形单链表解决约瑟夫问题的更多相关文章

  1. PHP算法学习(8) 环形链表 解决约瑟夫问题

    2019年2月25日17:29:17 Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓.于是决定了自杀方式,41个人排成一个圆圈 ...

  2. 数据结构——Java实现单链表

    一.分析 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点由元素和指针构成.在Java中,我们可以将单链表定义成一个类,单链表的基 ...

  3. JAVA数据结构——单链表

    链表:一. 顺序存储结构虽然是一种很有用的存储结构,但是他有如下几点局限性:1. 因为创造线性表的时候已经固定了空间,所以当需要扩充空间时,就需要重新创建一个地址连续的更大的存储空间.并把原有的数据元 ...

  4. 使用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 ...

  5. Java实现单链表的各种操作

    Java实现单链表的各种操作 主要内容:1.单链表的基本操作 2.删除重复数据 3.找到倒数第k个元素   4.实现链表的反转   5.从尾到头输出链表 6.找到中间节点 7.检测链表是否有环 8.在 ...

  6. java实现单链表的增删功能

    JAVA 实现单链表的增删功能 package linked; class LinkedTable{ } public class LinkedTableTest { public static vo ...

  7. php实现单,双向链表,环形链表解决约瑟夫问题

    传智播客PHP学院 韩顺平 PHP程序员玩转算法第一季  http://php.itcast.cn 聊天篇: 数学对我们编程来说,重不重要? 看你站在什么样的层次来说. 如果你应用程序开发,对数学要求 ...

  8. 用Java实现单链表的基本操作

    笔试题中经常遇到单链表的考题,下面用java总结一下单链表的基本操作,包括添加删除节点,以及链表转置. package mars; //单链表添加,删除节点 public class ListNode ...

  9. java实现单链表常见操作

    一.概述: 本文主要总结单链表常见操作的实现,包括链表结点添加.删除:链表正向遍历和反向遍历.链表排序.判断链表是否有环.是否相交.获取某一结点等. 二.概念: 链表: 一种重要的数据结构,HashM ...

  10. Java实现单链表的快速排序和归并排序

    本文描述了LeetCode 148题 sort-list 的解法. 题目描述如下: Sort a linked list in O(n log n) time using constant space ...

随机推荐

  1. Python实用代码片段(1)-rot13加密

    Python之禅:THIS.PY 你安装了python之后,能在Lib目录下找到一个this.py的文件,就是此处的内容. s = """Gur Mra bs Clgub ...

  2. 【读书笔记】JS函数式编程指南

    第一章 海鸥群可以合并和繁育 conjoin breed var result = flock_a.conjoin(flock_c).breed(flock_b).conjoin(flo ck_a.b ...

  3. 使用Kubernetes中的Nginx来改善第三方服务的可靠性和延迟

    使用Kubernetes中的Nginx来改善第三方服务的可靠性和延迟 译自:How we improved third-party availability and latency with Ngin ...

  4. 什么是push通知栏消息?

    我是3y,一年CRUD经验用十年的markdown程序员‍常年被誉为职业八股文选手 今天继续更新Austin,给Austin新增一个发送渠道(PUSH通知栏推送) Push通知栏消息是非常常见的,几乎 ...

  5. Mybatis的缓存与动态SQL

    Mybatis的缓存 缓存也是为了减少java应用与数据库的交互次数,提升程序的效率 一级缓存 自带一级缓存,并且无法关闭,一直存在,存储在SqlSession中 使用同一个sqlsession进行查 ...

  6. Rpc-实现Client对ZooKeeper的服务监听

    1.前言 在上一篇文章中,完成了ZooKeeper注册中心.但是在上一篇中,ZooKeeper添加了一个简单的本地缓存,存在一些问题: 当本地缓存OK,ZooKeeper对应服务有新的实例时,本地缓存 ...

  7. 使用idea的maven项目使用mybatis时遇到的坑

    在使用idea的maven项目中使用mybatis时遇到的一个问题,这个问题困扰了我一段时间,所以我来这里记录一下! 出现的问题是: 我把相同的代码复制到eclipse中,在eclipse中却能正常运 ...

  8. 软件设计师考试备考之UML

    UML 统一建模语言是面向对象软件的标准化建模语言. 事务 结构事务 UML模型中的名称,它们通常是模型的静态部分,描述概念或物理元素 图形表示: 行为事务 UML模型中的动态部分.它们是模型中的动词 ...

  9. nuxt+vant+rem项目构建

    原文链接:https://blog.csdn.net/Young_Gao/article/details/93605428 一.创建项目 1.使用如下命令生成项目 vue init nuxt-comm ...

  10. Bus Stop

    题目 题意: 大概就是在x轴上(一维),有n个房子的坐标,你要建立公交车站,使得每个房子离最近的车站不过10公里,求最少的车站. 思路: 很简单,之接贪心即可,每次判断当前房子的后20公里有没有房子, ...