0083 环形链表

news2024/11/15 9:27:17

 

 

 

package LinkedList_;

/*
 *     单向环形链表应用场景——约瑟夫问题
 *         设编号为1,2....n的n个人围成一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的人出列,
 *         它的下一位又从1开始报数,数到m的人又出列.....以此类推,直到所有人出列,产生一个出队编号序列。
 * 
 *     例如: n=5  => 总共有5个人
 *         k=1  => 从第1个人开始报数
 *         m=2  => 数2次
 *     出队编号序列为:2-->4-->1-->5-->3
 * 
 *    应用:用一个不带头结点的循环链表处理,构成一个有n个结点的循环链表,然后由k结点起从1开始计数,
 *        计到m时,删除对应的结点,然后再从下一个结点从1开始计数,直到最后一个结点从链表中删除
 *
 *     构建单向环形链表思路:
 *         1.先创建第一个结点,让first指向该结点,并形成环形
 *         2.每创建一个结点,就把该结点加入到已有的环形链表中
 * 
 *     遍历环形链表
 *         1.先让一个辅助变量temp,指向first结点
 *         2.通过while循环遍历该环形链表 当temp.next = first时结束
 * 
 *  出队编号序列
 *      1.创建一个辅助变量temp,事先应指向环形链表的最后一个结点
 *      2.报数前,让first和temp移动 k-1 次
 *      3.报数时,让first和temp同时移动 m-1 次
 *      4.让first指向的结点出队
 *          first = first.next;
 *          temp.next = first;
 *          出队结点没有任何引用,被回收
 *      
 */
public class RingLinkedList_ {
    public static void main(String[] args) {
        RingLinkedList ringLinkedList = new RingLinkedList();
        ringLinkedList.addNode(5);//加入五个结点
        ringLinkedList.showNode();//显示
        ringLinkedList.countNode(1, 2, 5);//2-->4-->1-->5-->3
        
        System.out.println("======================================");
        RingLinkedList ringLinkedList2 = new RingLinkedList();
        ringLinkedList2.addNode(38);
        ringLinkedList2.countNode(2, 4, 38);
    }
}

//创建环形单向链表
class RingLinkedList{
    //创建first结点
    public Node first = null;
    //添加结点
    public void addNode(int nums) {
        //校验
        if (nums < 1) {
            System.out.println("nums值不正确");
            return;
        }
        Node temp = null;//辅助变量,帮助遍历
        //使用for循环创建环形链表
        for (int i = 1; i <= nums; i++) {
            //根据编号创建结点
            Node node = new Node(i);
            if (i == 1) {//先创建第一个结点,让first指向该结点,并形成环形
                first = node;
                first.next = first;//构成环形
                temp = first;//让temp指向第一个编号
            }else {
                temp.next = node;
                node.next = first;
                temp = node;
            }
        }
    }
    
    //遍历(显示)
    public void showNode() {
        //判断是否为空
        if (first == null) {
            System.out.println("链表为空,没有结点");
            return;
        }
        //因为first不能动,仍使用辅助变量temp完成遍历
        Node temp = first;
        while(true) {
            System.out.printf("编号%d\n",temp.no);
            if (temp.next == first) {//遍历完毕
                break;
            }
            temp = temp.next;
        }
    }
    
    //出队序列
    //startNo表示k,从第几个开始数
    //countNum表示m,数几次
    //nums表示n,总共几人
    public void countNode(int startNo,int countNum,int nums) {
        //校验
        if (first == null || startNo < 1 || startNo > nums) {
            System.out.println("输入有误,请重新输入");
            return;
        }
        //1.创建一个辅助变量temp,事先应指向环形链表的最后一个结点
        Node temp = first;
        while(true) {
            if (temp.next == first) {//temp指向了最后结点
                break;
            }
            temp = temp.next;
        }
        //2.报数前,让first和temp移动 k-1 次
        for(int j = 0;j < startNo - 1;j++) {
            first = first.next;
            temp = temp.next;
        }
        //3.报数时,让first和temp同时移动 m-1 次
        //循环直到只有一个结点
        while(true) {
            if (temp == first ) {//只有一个结点
                break;
            }
            for(int j = 0;j < countNum - 1;j++) {
                first = first.next;
                temp = temp.next;
            }//这时first指向的结点就是要出队的结点
            System.out.printf("出队编号:%d\n",first.no);
            //4.让first指向的结点出队
            first = first.next;
            temp.next = first;
        }
        System.out.printf("最后的编号为:%d\n",first.no);
    }
}

//创建Node类,表示结点
class Node{
    public int no;//编号
    public Node next;//指向下一个结点,默认为null
    public Node(int no) {
        this.no = no;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1860.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑胶歌曲没权限,还好我会Python,一分钟一个歌单,硬盘有点不够用了~

今日份Python白嫖人生苦短&#xff0c;我用Python一、你需要准备1、环境2、模块二、效果展示三、代码展示四、写在最后人生苦短&#xff0c;我用Python 人之初&#xff0c;喜白嫖。大家都喜欢白嫖&#xff0c;我也喜欢&#xff0c;那么今天就来试试怎么白嫖抑云~ 我不是&#…

React面向组件编程(定义组件,组件三大核心属性,组件事件处理、组件收集表单数据、高阶函数和函数的柯里化)

目录 一、React中定义组件 1、函数式组件 2、类式组件 二、组件三大核心属性 1、组件三大核心属性1: State(状态) 2、组件三大核心属性2: props 3、组件三大核心属性3: ref 三、组件事件处理 1、事件处理 四、组件收集表单数据 1、受控组件 2、非受控组件 五、高阶函…

【数据结构】算法的时间复杂度和空间复杂度

&#x1f680; 作者简介&#xff1a;一名在后端领域学习&#xff0c;并渴望能够学有所成的追梦人。 &#x1f40c; 个人主页&#xff1a;蜗牛牛啊 &#x1f525; 系列专栏&#xff1a;&#x1f6f9;初出茅庐C语言、&#x1f6f4;数据结构 ☀️ 学习格言&#xff1a;眼泪终究流不…

象棋中的马跳步问题

象棋中的马跳步问题 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;象棋中的马跳步问题 CSDN&#xff1a;象棋中的马跳步问题 题目描述 中国象棋中&#xff0c;整个棋盘就是横坐标上 9 条线、纵坐标上 10 条线的一个区域&#xff0c;给你三个 参数 x&…

计算机毕业设计springboot+vue基本微信小程序的汽车租赁公司小程序

项目介绍 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时…

【Vue】环境搭建

Vue 简介&#xff1a; 一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。另一方面&#xff0c;当与现代化的工具链以…

Jenkins+Docker 一键自动化部署 SpringBoot 项目

本文章实现最简单全面的 Jenkins Docker Spring Boot 一键自动部署项目。步骤齐全&#xff0c;少走坑路。 环境&#xff1a;CentOS7 Git (Gitee) 实现步骤&#xff1a;在 Docker 安装 Jenkins&#xff0c;配置 Jenkins 基本信息&#xff0c;利用 Dockerfile 和 Shell 脚本实…

CSS 的布局 盒子

目录 块级元素和行内元素 块级元素 特点&#xff1a; 行内元素 特点&#xff1a; 行内元素 和 块级元素 的区别 改变显示模式&#xff08;把行内元素 变成 块级元素) 盒模型 盒模型图 边框基础属性 内边框、外边框 基础写法&#xff1a; 复合写法 块级元素水平居中 前提&#…

C++知识点大全(第二版)

目录 1 C简介 1.1 起源 1.2 应用范围 1.3 C和C 2开发工具 3 基本语法 3.1 注释 3.2关键字 3.3标识符 4 数据类型 4.1基本数据类型 4.2 数据类型在不同系统中所占空间大小 4.3 typedef声明 4.4 枚举类型 5 变量 5.1 变量的声明和定义 5.2 变量的作用域 6 运算…

如何当好硬软件助理工程师——实习周报(一)

如何当好硬软件助理工程师——实习周报 如何当好硬软件助理工程师——实习周报&#xff08;一&#xff09; 文章目录如何当好硬软件助理工程师——实习周报前言一、问题积累1.git 指令2.Coding的使用3.代码中的知识点&#xff08;HAL库、Flash读写&#xff09;a.gpio配置b.fla…

程序员必备的画图工具汇总

文章目录1、简介2、draw.io3、Excalidraw4、Xmind5、语雀6、Database6.1 dbdiagram.io6.2 sqldbm6.3 QuickDBD7、UML7.1 plantuml7.2 Graphviz结语1、简介 优秀的作图工具有许多&#xff0c;例如文本绘图工具 PlantUML&#xff0c;流程图设计工具 Draw.io&#xff0c;还有专业…

ORA-01861: literal does not match format string

系统&#xff1a;AnolisOS7.9 数据库&#xff1a;Oracle11.2.0.4 问题描述&#xff1a;执行TSPITR时&#xff0c;报错ORA-01861&#xff0c;如下所示&#xff1a; [oracleliujun~]$ export NLS_DATE_FORMATyyyy-mm-dd hh24:mi:ss [oracleliujun~]$ export NLS_LANGAMERICAN…

手写Mybatis源码(原来真的很简单!!!)

目录一、JDBC操作数据库_问题分析二、自定义持久层框架_思路分析三、自定义框架_编码1、加载配置文件2、创建两个配置类对象3、解析配置文件&#xff0c;填充配置类对象4、创建SqlSessionFactory工厂接口及DefaultSqlSessionFactory实现类5、创建SqlSession会话接口及DefaultSq…

R语言和医学统计学(10):正态性和方差齐性检验

本文首发于公众号&#xff1a;医学和生信笔记&#xff0c;完美观看体验请至公众号查看本文。 医学和生信笔记&#xff0c;专注R语言在临床医学中的使用&#xff0c;R语言数据分析和可视化。 文章目录前言正态性检验shapiro wilk检验kolmogorov smimov检验方差齐性检验两样本方差…

SSH框架重构需求,起码读懂代码和前端的原生JS

文章目录SSH(Spring Struts Hibernate)商城老项目JSPHtmlJsJquery 老项目部署Tomcat上面进行部署可以一次性部署多个项目1.Spring2.Struts3.Hibernate(持久层一个重量级框架)4.里面的请求路径解析SSH(Spring Struts Hibernate)商城老项目JSPHtmlJsJquery 老项目部署 Tomca…

【JavaSE之JDK8新特性】三万字详文带你了解JDK8新特性

JDK8新特性一、Lambda1.1需求分析2.Lambda表达式的初级体验3.Lambda表达式的语法规则3.1.Lambda练习13.2.Lambda表达式练习24.FunctionalInterfa注解说明5.Lambda表达式的原理6.Lambda表达式的省略写法7.lambda表达式的使用前提8.lambda和匿名内部类的对比二、接口中新增的方法…

#define宏的妙用!实现你以为的函数offsetof等

目录 一.#define 1.1#define的使用 1.2在define定义标识符的时候&#xff0c;要不要在最后加上 ;? 二.#define定义宏 2.1好代码的写法: 2.2#define 替换规则 2.3#和## 三.带有副作用的宏参数 四.宏和函数的对比 五.实现offetof 思路解析过程&#xff1a; 代码实现&am…

破解系统密码

一、利用5次shift漏洞破解win7密码 1.1 漏洞 1. 在未登录时&#xff0c;连续按5次shift键&#xff0c;弹出程序C:\Windows\System32\sethc.exe 2. 部分win7及win10系统在未进入系统时&#xff0c;可以通过系统修复漏洞篡改系统文件名&#xff01; 注意&#xff1a;如win7或win…

SpringBoot/Spring AOP默认动态代理方式

Spring 5.x中AOP默认依旧使用JDK动态代理SpringBoot 2.x开始&#xff0c;AOP为了解决使用JDK动态代理可能导致的类型转换异常&#xff0c;而使用CGLIB。在SpringBoot 2.x中&#xff0c;AOP如果需要替换使用JDK动态代理可以通过配置项spring.aop.proxy-target-classfalse来进行修…

【Linux】7.0 信号

文章目录信号的基本概念kill -l 查看信号列表信号的处理方式signal( ) 自定义处理信号信号的产生方式键盘产生进程异常&#xff08;core dump&#xff09;系统调用软件条件信号的发送&#xff08;OS&#xff09;信号常见相关名词解释进程接收处理信号原理信号集函数的使用打印p…