单向环形链表

约瑟夫问题

Josephu问题为:设编号为1, 2, …n的n个人围坐一圈,约定编号为k (1<=k<=n) 的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生- -个出队编号的序列。

n = 5即有五个人

k=1,从第一个人开始

m=2,数两下

出队列的顺序是 2——4—–1—–5——-3

思路

1.先创建第一个节点,让我们的first指向该节点,并形成环形

2.后面当我们创建一个新的节点,就把该节点,加入到已有的环形链表中

遍历环形链表

先让一个辅助指针(变量),指向first节点

然后通过一个while循环遍历改环形链表即可当:curBoy.next = first结束

出圈思路

1.需要创建一个辅助指针(变量)helper,事先应该指向环形链表的最后这个节点

当然,我们要小孩报数前,让first和helper移动k-1次,移动到k那个地方

2.当我们的小孩报数时,我们的first和helper同时移动m-1次

3.将我们first指向的小孩 节点出圈

​ first = first.next;

​ helper.next = first;

原来first指向的节点,就没有任何引用了,就会被回收

代码实现

package com.wang.linkedlist;/*** @author 王庆华* @version 1.0* @date 2020/12/9 21:07* @Description TODO* @pojectname 算法代码*/
public class Josepfu {public static void main(String[] args) {CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList();circleSingleLinkedList.addBoy(5);//加入五个小孩
//        circleSingleLinkedList.showBoy();circleSingleLinkedList.countBoy(1,2,5);}
}//创建环形单向链表
class CircleSingleLinkedList{//创建我们的第一个节点,当前还没有编号private Boy first = null;//添加小孩节点,构建成环形链表public void addBoy(int nums){//对我们的nums做一个简单的数据校验if (nums<1){System.out.println("nums的值不被允许");return;}Boy curBoy = null;//辅助指针,帮助我们构建环形链表//使用for循环创建我们的环形链表for (int i = 1; i <=nums ; i++) {//根据编号创建小孩节点Boy boy = new Boy(i);//如果是第一个小孩if (i == 1){first = boy;//构成我们所说的环状first.setNext(first);curBoy = first;//让我们的curBuy指向第一个小孩}else {curBoy.setNext(boy);//将我们原来指向第一个节点指向现在新加的节点boy.setNext(first);//我们新加的节点的next节点指向第一个curBoy = boy;//我们的辅助节点指针,移到我们新加的节点上}}}/*** 遍历我们的环形链表*/public void showBoy(){//判断是否为空if (first == null){System.out.println("链表为空,没有小孩");return;}//因为我们的first指针不能动,所以我们使用一个辅助指针来遍历我们的链表Boy curBoy = first;while (true){System.out.println("小孩的编号:"+curBoy.getNo());//遍历完毕if (curBoy.getNext() == first){break;}curBoy = curBoy.getNext();//curBoy向后面移动}}//根据用户的输入,计算小孩的出圈顺序/**** @param startNo   表示从第几个小孩开始报数* @param countNum  表示我们一次数几下,一次报几个数* @param nums      表示最初有多少个小孩在圈中*/public void countBoy(int startNo,int countNum,int nums){//先对数据校验if (first == null || startNo < 1||startNo>nums){System.out.println("参数输入有误,请重新输入");return;}//创建辅助指针,帮助我们的小孩出圈Boy helper = first;//需要创建一个辅助指针(变量)helper,事先应该指向环形链表的最后这个节点while (true){if (helper.getNext() == first){break;}helper = helper.getNext();//往下走}//小孩报数前,让first和helper移动k-1次,移动到k那个地方for(int j =0;j<startNo-1;j++){first = first.getNext();helper = helper.getNext();}//当我们的小孩报数时,我们的first和helper同时移动m-1次,然后出圈//这里是一个循环操作,直到圈中只剩一个while (true){if (helper == first){//圈中只有一个孩子了break;}//让first和helper同时移动conutNum -1for (int j = 0; j<countNum-1;j++){first = first.getNext();helper = helper.getNext();}//这是first指向的节点,就是要出圈的小孩System.out.println("小孩出圈"+first.getNo());//这时将first指向的小孩节点出圈first = first.getNext();//helper的next设置成我们删除小孩节点的下一个节点helper.setNext(first) ;}System.out.println("最后留在圈中的小孩编号是"+first.getNo());}}//创建一个小孩类,表示一个节点
class Boy{private int no;//编号private Boy next;//指向下一个节点,默认为nullpublic Boy(int no) {this.no = no;}public int getNo() {return no;}public void setNo(int no) {this.no = no;}public Boy getNext() {return next;}public void setNext(Boy next) {this.next = next;}
}

数据结构-----环形链表相关推荐

  1. 数据结构--环形链表

    环形链表的一种Go语言实现 package mainimport "fmt"//定义一个环形链表的节点结构体 type circleSingleLink struct {id in ...

  2. java环形链表_数据结构和算法(四)Java实现环形链表

    1. 数据结构和算法(四)Java实现环形链表 1.1 约瑟夫问题 约瑟夫问题:公元66年,约瑟夫不情愿地参与领导了犹太同胞反抗罗马统治的起义,后来起义失败,他和一些宁死不降的起义者被困于一个山洞之中 ...

  3. 数据结构-链表-环形链表

    数据结构-链表-环形链表 环形链表就是将单链表的尾部指向头部,从而形成一个单方向的环形结构,环形链表中每个元素都可以是head,也都可以是尾部,这样就不用担心链表头指针遗失的问题,而且在遍历链表的时候 ...

  4. 图解Java数据结构之环形链表

    本篇文章介绍数据结构中的环形链表. 介绍 环形链表,类似于单链表,也是一种链式存储结构,环形链表由单链表演化过来.单链表的最后一个结点的链域指向NULL,而环形链表的建立,不要专门的头结点,让最后一个 ...

  5. 【Java 数据结构 算法】宁可累死自己, 也要卷死别人 8 环形链表

    [Java 数据结构 & 算法]⚠️宁可累死自己, 也要卷死别人 8⚠️ 环形链表 概述 链表 环形链表 环形链表实现 Node 类 insert 方法 remove 方法 main 完整代码 ...

  6. 基础数据结构【四】————环形链表与多项式

    主要演示环形列表节点的创建插入, 删除,遍历,环形链表连接 .双向链表节点的建立与插入 ,双向链表中节点的删除 以及环形链表在多项式中的应用 DEMO1:环形链表节点的创建与插入 /* [名称]:ch ...

  7. 数据结构:单向环形链表

    约瑟夫问题 public class Josephus {public static void main(String[] args){SingleCircleLinkedList single = ...

  8. (数据结构与算法)单向环形链表解决约瑟夫问题

    约瑟夫(Josephu)问题 Josephu问题为: 设编号为1, 2,- n的n个人围坐一圈,约定编号为k (1<=k<=n) 的人从1开始报数,数到m的那个人出列,它的下一位又从1开始 ...

  9. 数据结构 - 链表(单向环形链表)(约瑟夫问题)

    问题如下(与分析) 构建思路 输入一个数,数到这个数的小孩出圈,出圈顺序的思路 代码实现 根据图解,来一步一步实现 //根据用户输入,计算小孩出圈顺序/**** @param startNo 表示从第 ...

  10. 数据结构 02 - 单链表的使用 环形链表的实现与应用

    一.单链表的使用 1.链表 定义:链表是有序的列表 关键点:链表是学树和图的基础 特点: (1)链表是以节点的方式来存储的,即所谓的链式存储 (2)每个节点包含data域和next域,后者的作用是指向 ...

最新文章

  1. 有效的rtsp流媒体测试地址汇总
  2. visual studio输入法打不了中文_我为什么不用Mac自带输入法
  3. 数字新写法3_000_000,简单明了
  4. ACL 2021 | 复旦大学邱锡鹏组:面向不同NER子任务的统一生成框架
  5. python for in语句 index_使用for循环查找句子中的单词及其索引位置
  6. SAP Spartacus angular.json 中定义的 serve-ssr
  7. 教你简单理解分布式与传统单体架构的区别
  8. x64 stack walking、调用约定、函数参数识别
  9. php session警告屏蔽,PHP Session的一个警告
  10. linux特殊权限之访问权限
  11. mininet编程实现交换机规则的插入、删除与修改。_三层以太网交换机基本原理及转发流程...
  12. 关于序列化的 10 几个问题,你肯定不知道
  13. HBuilderx中编译sass文件
  14. 剑指offer-面试题37:序列化二叉树及二叉树的基本操作和测试
  15. Modbus调试软件使用教程
  16. 【StyleGAN代码学习】StyleGAN损失函数与训练过程
  17. Eidetic:助你提升记忆力的酷应用
  18. Authing 新增 AWS、钉钉、腾讯 QQ 、百度、新浪微博等多种身份源|功能更新
  19. 基于Android studio有声听书系统 java音乐播放器系统
  20. 计算机硬盘属于主机还是外部设备,计算机主机的外部连接分别是什么?

热门文章

  1. php选择版本,怎样选择PHP的版本
  2. 计算机系统结构 02325_计算机系统的组成硬件系统1
  3. 初识计算机编程语言教案,完整版,初识VB教学设计
  4. Vue:vue过滤器的使用、借助第三方库moment.js实现时间过滤器
  5. SLAM_四元数取逆-Quaternion Inverse - 已验证
  6. 深度学习笔记_术语/缩写/基本概念
  7. 阳明大神---容器时代
  8. 浅析busybox如何集成到openwrt
  9. Python——数据类型初步:Numbers
  10. 设计模式之设计原则(一)