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

数据结构--单链表 那么N的值最后就会由1变为-1,这是说明快指针赶上并超过了慢指针,并没有重合,为了验证下一圈是否会重合,我们这样计算:在慢指针刚进入环时,慢指针走的路程为L,快指针为3L,等于L+C-N+kC(kC的意思是快指针走了k圈环后来到此位置),列出等式:3L=L+C-N+kC;N为奇数时,当快指针超过慢指针来到下一圈,此时距离为C-1;必不可少,由于快指针要比慢指针遍历的更快,我们可以假设当慢指针刚到环的第一个位置时,快指针与慢指针的差距为N,而环的总长度为C,链表的头节点到环的第一个结点的距离为L, 阅读详情

一、单链表的使用

1.链表

定义:链表是有序的列表
关键点:链表是学树和图的基础
特点:
(1)链表是以节点的方式来存储的,即所谓的链式存储
(2)每个节点包含data域和next域,后者的作用是指向下一个节点
(3)链表的各个节点不一定是连续存储
(4)链表分为带头节点的链表和没有头节点的链表,这需要根据实际需求来确定

2.使用单链表使用红楼梦人物排列:

(1)完成对人物的增删改查操作
(2)第一种添加方法:直接添加到链表的尾部
(3)第二种添加方法:按照序号排名将人物插入到指定位置(如果该位置已有数据,则提示已有数据,无法添加)

代码实现:

public class SingleLinkedListTest {
    public static void main(String[] args) {
        //先创建节点
        HeroNode heroNode1 = new HeroNode(1, "贾宝玉", "宝二爷");
        HeroNode heroNode2 = new HeroNode(2, "林黛玉", "林妹妹");
        HeroNode heroNode3 = new HeroNode(3, "薛宝钗", "宝姐姐");
        HeroNode heroNode4 = new HeroNode(4, "王熙凤", "二奶奶");
        HeroNode heroNode5 = new HeroNode(5, "贾琏", "琏二爷");
        HeroNode heroNode6 = new HeroNode(6, "贾雨村", "假语村言");
        HeroNode heroNode7 = new HeroNode(7, "甄士隐", "真事隐");
        HeroNode heroNode8 = new HeroNode(8, "贾迎春", "二呆子");
        HeroNode heroNode9 = new HeroNode(9, "贾元春", "贤德妃");
        HeroNode heroNode10 = new HeroNode(10, "柳湘莲", "美男子");

        HeroNode heroNode11 = new HeroNode(6, "薛蟠", "大傻子");
        //把节点添加到链表中
        singleLinkedList s1 = new singleLinkedList();
        s1.add2(heroNode1);
        s1.add2(heroNode3);
        s1.add2(heroNode2);
        s1.add2(heroNode4);
        s1.add2(heroNode5);
        s1.add2(heroNode6);
        s1.add2(heroNode7);
        s1.add2(heroNode8);
        s1.add2(heroNode9);
        s1.add2(heroNode10);

        //s1.delete(heroNode1);
        //s1.modify(heroNode11);
        HeroNode find = s1.find(3);
        System.out.println(find);
        System.out.println();
        //s1.list();
    }
}

//创建一个singleLinkedList
class singleLinkedList{
    //先初始化一个头节点,头节点不要动,不存放具体数据
    private HeroNode head = new HeroNode(0,"","");
    //添加节点到单向链表
    //当不考虑编号的顺序时,1.找到当前链表的最后节点;2.将最后这个节点的next指向新的节点
    public void add1(HeroNode heroNode){
        //因为head节点不能动,因此需要一个辅助遍历temp
        HeroNode temp = head;
        //遍历链表,找到最后
        while (true){
            if(temp.next == null){
                break;
            }
            //如果没有找到,则将temp后移
            temp = temp.next;
        }
        //当退出while循环时,temp就指向了链表的最后
        //将最后这个节点的next,指向新的节点
        temp.next = heroNode;
    }
    public void add2(HeroNode heroNode){
        //因为head节点不能动,因此需要一个辅助遍历temp
       HeroNode temp = head;
       boolean flag = false;
       while (true){
           if(temp.next == null){
               break;
           }
           if(temp.next.number > heroNode.number){
               break;
           }else if(temp.next.number == heroNode.number){//说明该编号的数据已经添加进链表了
               flag = true;
               break;
           }
           temp = temp.next;
       }
        if(flag){
            System.out.println("该编号的数据已添加进链表中,不能再添加了");
        }else {
            heroNode.next = temp.next;
            temp.next = heroNode;
        }
    }
    //显示链表
    public void list(){
        //判断链表是否为空
        if(head.next == null){
            System.out.println("链表为空");
            return;
        }
        //因为头节点不能动,所以我们需要一个辅助变量来遍历
        HeroNode temp = head.next;
        while (true){
            if(temp.next == null){
                System.out.println(temp);
                break;
            }
            System.out.println(temp);
            temp = temp.next;
        }
    }
    //删除人物
    public void delete(HeroNode heroNode) {
        HeroNode temp = head;
        while (true) {
            if (temp.next == null) {
                System.out.println("链表为空 ");
                break;
            } else if (temp.next.number == heroNode.number) {
                temp.next = heroNode.next;//没有指向的节点会被垃圾回收机制回收
                break;
            }
            temp = temp.next;
        }
    }
    //修改人物
    public void modify(HeroNode heroNode){
        HeroNode temp = head;
        while (true){
            if(temp.next == null){
                System.out.println("链表为空");
                break;
            }else if(temp.next.number == heroNode.number){
                heroNode.next = temp.next.next;
                temp.next = heroNode;
                break;
            }
            temp = temp.next;
        }
    }
    //寻找指定人物
    public HeroNode find(int number){
        HeroNode temp = head;
        boolean flag = false;
        while (true){
            if(temp.next == null){
                System.out.println("链表为空");
                break;
            }else if(temp.next.number == number){
                return temp.next;
            }
            temp = temp.next;
        }
        return null;
    }
}
//每个HeroNode对象,就是一个节点
class HeroNode{
    public int number;
    public String name;
    public String nickname;
    public HeroNode next;//类中又实例化一个类,这个类就是当前已声明类的下一个类,即当前节点的下一个节点,就达到了next的效果

    public HeroNode(int number, String name, String nickname) {
        this.number = number;
        this.name = name;
        this.nickname = nickname;
    }

    @Override
    public String toString() {
        return "[number=" + number + ",name=" + name + ",nickname=" + nickname + "]";//当ssot对象时,调的是该对象的toString方法
    }
}

二、环形链表的实现与应用

1.构建单向形链表
在这里插入图片描述
(1).先创建一个节点,让first指向该节点,并形成环形
(2).后面每创建一个新的节点,就把该节点加入到已有的环形链表中

2.环形链表的遍历

(1).先让一个辅助指针curBoy指向first节点
(2).然后通过while循环遍历该环形链表,知道curBoy.next == first结束

3.实现游戏

假设有n个小孩围成一圈,从第k个小孩开始报数,数m下后指向的这个小孩淘汰,直到剩下最后一个小孩,则游戏结束

在这里插入图片描述

1.首先构建一个辅助变量helper,开始指向环形链表的最后一个节点
2.小孩报数前,先让first和helper移动k-1次
3.当小孩报数时,让first和helper移动m-1次
4.此时first指向的小孩淘汰
first = first.next
helper.first = first
(原来first指向的节点没有任何引用,将会被回收)

代码实现:

public class CircleLinkedListTest {
    public static void main(String[] args) {
        CircleSingleLinkedList circle= new CircleSingleLinkedList();
        circle.addBoy(10);
        circle.gameBoy(3,5,10);
        //circle.showBoy();
    }
}
class CircleSingleLinkedList{
    private Boy first = null;

    public void addBoy(int number){
        if(number < 1){
            System.out.println("输入参数有误,请重新输入");
            return;
        }
        Boy curBoy = null;
        for (int i = 1; i <= number; i++) {
            Boy boy = new Boy(i);
            if(i == 1){
                first = boy;
                first.setNext(first);
                curBoy = first;
            }else {
                curBoy.setNext(boy);
                boy.setNext(first);
                curBoy = boy;
            }
        }
    }
    public void showBoy(){
        Boy temp = first;
        if(first == null){
            System.out.println("链表为空");
            return;
        }
        while (true){
            if(temp.getNext() == first){
                System.out.println("小孩编号为:" + temp.getNumber());
                break;
            }else {
                System.out.println("小孩编号为:" + temp.getNumber());
            }
            temp = temp.getNext();
        }
    }
    public void gameBoy(int startnumber,int countnumber,int totalnumber){
        if(first == null || startnumber > totalnumber){
            System.out.println("输入参数有误,请重新输入");
            return;
        }
        Boy helper = first;
        while (true){
            if(helper.getNext() == first){
                break;
            }
            helper = helper.getNext();
        }
        while (true){
            if(first.getNext() == first){
                System.out.println("最后剩下的小孩为:"  + first.getNumber());
                break;
            }
            //helper和first同时移动startnumber - 1
            for (int i = 0; i < countnumber - 1; i++) {
                first = first.getNext();
                helper = helper.getNext();
            }
            //helper和first同时移动startnumber - 1
            for (int i = 0; i < countnumber - 1; i++) {
                first = first.getNext();
                helper = helper.getNext();
            }
            //淘汰最终点到的小孩
            System.out.println("淘汰的小孩为:" + first.getNumber());
            first = first.getNext();
            helper.setNext(first);
        }
    }
}
class Boy{
    private int number;
    private Boy next;

    public Boy(int number) {
        this.number = number;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public Boy getNext() {
        return next;
    }

    public void setNext(Boy next) {
        this.next = next;
    }
}

Cadence17.4 Allegro PCB制板(gerber / 光绘)文件输出的顺序及注意点 Cadence Allegro PCB制板文件输出 (gerber 光绘文件输出) 阅读详情

相关推荐

2023年5月青少年软件编程Python等级考试四级真题(含答案和解析)

电子学会,2023年5月,青少年软件编程,Python等级考试,四级真题(含答案和解析)

m0_37554648的博客 905

数据结构与算法(6):单向环形链表的应用场景(josephu问题)

一:(约瑟夫环)问题 n个人围成一个圈,指定一个数字n,从第一个人开始报数,每轮报到m的选手出局,由下一个人接着从头开始报,最后一个人是赢家。其中m>1,n>2。 我们可以发现这是一个闭合的换,符合单向环形问题 思路分析: 假如说我有五个人,n=5,k=1,m=2.就是说数2下的话,出队编号就是: 如图: 首先就是2出队列,如下图 接着4号出队列: 接着1号开始出队列: 再接着5号出列; 最后一号出列: 这样的话出队列的顺序就会变成 2->4->1->5->3 然后根据

qq_42400763的博客 599

ISP图像处理Verilog仿真框架搭建(附代码)

基于Verilog的图像处理仿真框架搭建

路漫漫其修远兮,吾将上下而求索 1898

【尚硅谷】数据结构和算法——单向环形链表

Josephu 问题为:设编号为1,2,...,n 的 n 个人围坐一圈,约定编号为 k(1

weixin_54533016的博客 360

‌NTRU算法详细教程 | 2025年最新版(基于NIST后量子密码标准更新)

‌:NTRU是当前抗量子加密的黄金标准,‌。

blns_yxl的博客 1804

细说VLAN之untag和tag

一、拓扑图 先给出上面拓扑图的结论,后面再详细讲解: 结论:只有PC1与PC4之间能相互通信,除此之外,所有PC之间均不能通信,比如PC1与PC3不能建立通信。 针对Ping命令的一个知识: 要想ping通某台主机,必须满足两个条件: 1,源主机的ICMP请求包必须能达到目的主机。 2,目的主机的ICMP应答包必须能回到源主机。 二、理论基础 端口的出...

NoobMaster的博客 3万+

环形链表详解(让你彻底理解环形链表)

环形链表是一种特殊类型的链表数据结构,其最后一个节点的"下一个"指针指向链表中的某个节点,形成一个闭环。换句话说,链表的最后一个节点连接到了链表中的某个中间节点,而不是通常情况下连接到空指针 (null)

2301_80344616的博客 4525

推荐系统[八]算法实践总结V3:重排在快手短视频推荐系统中的应用and手淘信息流多兴趣多目标重排技术

快手推荐系统包括了传统的召回、粗排、精排、Learning To Rank 的多目标排序、多目标预估等技术环节。而在这些模块之后的技术环节就属于重排序,主要包括手机端和服务端两部分。服务端通过传统服务器部署重排服务,包括序列重排、多源内容混排、多样性模块。端上部分包括端上重排模型和端上重排策略两部分。重排技术是快手十分重要的技术环节,它的发展速度远快于其他排序环节,属于较新的技术范畴。整个序列的价值并非单 item 效果的累计,如何使得序列价值最大化;

丨汀、的博客 1064

环形链表

定义:环形链表是将 单向链表的首尾相连,可以通过头节点往下再次寻找到头节点。 链表主要作用就是方便删除和增加节点使用的,在查找方面有一定的缺陷。 环形链表主要用于解决约瑟夫问题 约瑟夫问题: 设编号为 1,2,3,…n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出列编号的序列。 当然这个问题用数组也能够实现,这里仅考虑使用环形链表,打开算法思路和了解环形链表 exp

Gdevelopment的博客 1329

汽车行业OTD业务模式入门学习

本文是在学习彭俊松老师的《汽车行业整车订单交付系统》后,对于OTD理解的一些摘录,供诸位参考学习。

qq_40664711的博客 1万+

十三种通信接口芯片——《器件手册--通信接口芯片》

通信接口芯片用于实现差分信号的传输,具有抗干扰能力强、传输距离远等优点。RS485支持多点通信,可连接多个收发器,而RS422支持单向多点通信。广泛应用于工业自动化、过程控制、仪器仪表、楼宇自动化(如暖通空调、保安系统)、电机控制等领域。ST3485EBDRTP8485ESR用于实现串行通信,支持点对点通信,传输距离相对较短,数据速率较低。常用于计算机与外设(如打印机、调制解调器)之间的通信。如芯力特的SIT3232,可作为ST3232的替代品。

XU157303764的博客 4276

【环形链表】

环形链表的三种解题实现,让我们来进行思想的碰撞吧!

m0_熊猫馆主的博客 1090

28-Halcon-- union_object_model_3d函数功能(用于3D模型融合)

Halcon算子union_object_model_3d是专业的3D模型融合工具,主要用于多视图拼接、部件组装和多源数据融合。该算子支持点云、网格和参数化模型输入,提供多种融合算法选择,包括基础点云拼接('points_cloud')、网格融合('mesh')和精确CAD布尔运算('cad')。工业应用涵盖逆向工程扫描拼接、汽车部件虚拟装配等场景,支持性能优化如空间分区和流式处理。算子还解决颜色属性融合、法向量保留等特殊需求,并提供拼接误差分析、拓扑验证等质量评估手段。最佳实践包含动态场景重建工作流和CA

weixin_45590420的博客 1055

【LeetCode&数据结构】单链表的应用——环形链表问题详解

🔥前言:牛客网和LeetCode的刷题都不可或缺,我们都要做一做,无论是参加竞赛还是笔试面试,至少能提升你的代码能力!洛谷的题目也可以去做一做。力扣的题目对提升代码能力很有帮助,需要有一点基础,几乎都是接口型的题目,关于接口型和IO型的区别我们在本专栏的第一篇中就介绍过了,这里不再赘述,我们进入今天的力扣题目介绍——

艾莉丝努力练剑的博客,感谢大家一直以来的对艾莉丝的支持和鼓励,uu们如果对C/C++方向感兴趣的话,可以通过艾莉丝主页的微信名片加艾莉丝的好友,和努力练剑的艾莉丝一起加油! 1495

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java数据结构与算法-链表(单链表、双向链表、环形链表、约瑟夫问题)[day02]

day02-链表 单链表介绍和内存布局 链表是有序的列表,但是内存中是实际存储结构如下: 小结: 1.链表是以节点的方式来存储,是链式存储(即各个节点之间并不一定是连续存储的,而是相互指向的); 2.每个节点包含 data 域:存放数据的域, next 域:指向下一个节点; 3.如图:发现链表的各个节点不一定是连续存储; 4.链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定. 单链表(带头结点) 逻辑结构示意图如下: 单链表创建和遍历的分析实现 例子 使用带head头的单向

SwaeLeeUknow的博客 749

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【LeetCode&牛客&数据结构】单链表的应用——环形链表及链表分割问题详解

📖。

2302_80761497的博客 872

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

本篇文章介绍数据结构中的环形链表。 介绍 环形链表,类似于单链表,也是一种链式存储结构,环形链表由单链表演化过来。单链表的最后一个结点的链域指向NULL,而环形链表的建立,不要专门的头结点,让最后一个结点的链域指向链表结点。 简单点说链表首位相连,组成环状数据结构。如下图结构: 而在环形链表中,最为著名的即是约瑟夫环问题。 约瑟夫环问题 问题介绍: 设编号为1、2、3、… 、n的n个人围坐一圈,...

。。。 7750

单链表之python实现学习笔记及环形链表-反转链表

一、单链表定义 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。 链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。 二、python实现 用python实现单链表操作,包括创建、遍历、增添、删除,代码如下: class Node(object): ...

melody 2629

【数据结构】单链表OJ题(二)

在上一期中我们给大家介绍了单链表,也了解了单链表的实现。接下来就让我们进入实践,练习一些经典题目,让我们对单链表的理解更加深入

小王又困了的博客 2295

数据结构:单链表的应用(力扣算法题)第二章

本文总结了力扣三道链表相关算法题的解法:1.相交链表(160题):通过计算两链表长度差,使长链表先移动差值步,再同步遍历找到相同地址的相交节点。2.环形链表(141题):使用快慢指针法,证明快指针每次走两步总能与慢指针相遇,并分析快指针走多步时的相遇条件。3.环形链表II(142题):在确认有环后,证明相遇点到入环点的距离等于头节点到入环点的距离,据此找到入环点。三题均给出了详细代码实现和数学证明。

分享C,C++,数据结构,Linux,算法内容 1177

Java数据结构与算法 day02 链表

文章目录第三章 链表单链表介绍和内存布局单链表创建和遍历的分析实现添加(创建)过程遍历过程代码实现单链表按顺序插入节点单链表节点的修改单链表节点的删除和小结单链表面试题新浪面试题腾讯面试题百度面试题课后练习双向链表增删改查分析图解及实现 第三章 链表 单链表介绍和内存布局 链表是有序的列表,但是它在内存中是实际存储结构如下: 小结: 1.链表是以节点的方式来存储,是链式存储(即各个节点之间并不一定是连续存储的,而是相互指向的); 2.每个节点包含 data 域:存放数据的域, next 域:指向下一个

杨丙寅 3316

Java数据结构与算法分析 | 链表(单链表、双链表、环形链表)

GitHub源码分享 项目主页:https://github.com/gozhuyinglong/blog-demos 本文源码:https://github.com/gozhuyinglong/blog-demos/tree/main/java-data-structures/src/main/java/com/github/gozhuyinglong/datastructures/linkedlist 1. 前言 通过前篇文章《数组》了解到数组的存储结构是一块连续的内存,插入和删除元素时其每个部分都

人生就是一个不断学习的过程 1045

数据结构单链表的实现

摘要:本文详细介绍了单链表的概念、结构及实现方式。单链表由独立申请的节点组成,每个节点包含数据域和指针域,物理上不连续但逻辑上连续。文章对比了带头节点和不带头节点单链表的区别,并提供了完整的C语言实现代码,包括节点创建、插入、删除、查找等基本操作。通过结构体定义和指针操作,展示了单链表动态内存管理的特点及其相比顺序表的优势(插入删除高效、避免空间浪费)。

TH2983443454的博客 1176

[数据结构]题海啊,全是水(四)相交链表、环形链表、环形链表II

这个是一个目录哦相交链表你说的链表,它相交吗?交啊,交在哪啊?代码环形链表分析代码环形链表II分析比啥都重要代码最后 菜鸡大学生的数据结构——刷题篇4 链表刷题最后一篇,好耶! 再写下去菜鸡大学生要编不出前言了,或许本来就不需要前言? 啊—— 相交链表 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 这道题简单来说就两个思路: 是否相交? 如果是,交点在哪? 我们先

Jessica的博客 2918

在单链表写入一组数据代码_『数据结构与算法』链表(单链表、双链表、环形链表)...

GitHub源码分享 项目主页:https://github.com/gozhuyinglong/blog-demos 本文源码:https://github.com/gozhuyinglong/blog-demos/tree/main/java-data-structures1. 前言 通过前篇文章《数组》了解到数组的存储结构是一块连续的内存,插入和删除元素时其每个部分都有可能整体移动。为了避免...

weixin_36377516的博客 130

【入门必备】Java数据结构详解

数据结构入门必看!本文整理了稀疏数组、队列、链表、栈这几种经典的数据结构。快来一起敲代码吧!!!

weixin_62633072的博客 9583
上一篇: 数据结构 01 - 稀疏数组的实现 && 数组模拟循环队列
下一篇: 数据结构 03 - 数组模拟出入栈 && 使用栈实现表达式的计算
终难忘世外仙株寂寞林
博客等级 码龄6年 0粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值