图解&代码实现:单向链表的创建(直接添加到链表的尾部,不考虑排序)_添加到链表尾部-程序员宅基地

技术标签: 算法  java  单链表  数据结构和算法  链表  数据结构  

链表的基本介绍

链表是有序列表,链表的英文是LinkedList

链表的特点:

  1. 链表是以结点方式来存储的,链表是链式存储

  2. 链表中的每个结点都分data域和next域

    data域 : 用来存放数据

    next域:用来指向下一个结点

    下面展示的是 链表再内存中的实际结构的布局图:

在这里插入图片描述

  1. 链表的各个结点不一定是连续存储的

  2. 链表分为带头结点的链表和不带头结点的链表,具体要不要带头结点,根据自己的需求而定


链表的实际案例

在这里插入图片描述

实现:管理在线的用户

需求:在某个约定时间,把某个人的好友发送给服务器,但是发送过去的好友编号并不是连续的,要求在服务器上把所有的好友信息按照编号的顺序返回给客服端,因为客服端要定时地向服务器去询问其好友的状态,而服务器需将客服端发送过来的好友按照编号顺序返回,比如说客服端发送过来某一个人的好友编号是 20、1、19、38、5,发给服务器后,要求把这个人的状态返回给客服端,但是要求返回的好友编号顺序是按照从小到大的顺序排列的,比如 1 、 5、19 、20、38,并且不允许查数据库,不能将数据存入数据库中,然后通过order by返回,这样是不允许的。要求在内存中就将这个排序工作做完,有时间和速度要求。

解决方法:使用链表来实现

实现思路:获取到好友Id编号后,按照顺序插入到单向链表中去


带头结点的单链表的逻辑结构,如下图所示
在这里插入图片描述

根据上图做描述:头结点指向a1,a1执行a2,a2指向a3,依此类推,若链表中最后一个结点的next域为null就代表链表结束了。

从上图看出a1后面就是a2,a2后面就是a3,依此类推。但这只是逻辑结构,之所以这样画是因为a1的下一个next域正好是指向a2的,但实际上在内存中,a1后面并不一定马上指的就是a2,a1的next域只是通过指针指向了a2的一个地址,最后将它们连成了一个单链表。该图链表中的各个结点看起来好像是连续存储的,但实际上不是。在做开发做分析时,往往都是这样画链表。实际的存储如下图所示:
在这里插入图片描述


单链表的应用实例

使用带head头结点的单向链表实现实现水浒英雄排行榜的管理,即:用链表来管理一些英雄人物

目标:完成对英雄人物的增删改查,也就是对结点的增删改查的操作

创建单链表的形式:

  1. 直接添加在链表尾部,不考虑排序

    即:给我一个英雄对象,我就把它加入到链表最后,不考虑排序

  2. 在添加结点时,考虑排序

    即:在添加英雄时,考虑其排名


创建单链表的示意图(添加) 和 遍历单链表的思路分析:

何为创建?即 添加,添加结点的同时产生链表。
在这里插入图片描述

注意:

  1. head头结点不存放具体的数据
  2. head头结点的作用:就是用来连接整个链表,表示单链表的头

根据上图,分析创建单链表的思路:

当我创建一个新的HeroNode结点,然后让头结点的next域指向这个新建的HeroNode结点,这个新建的HeroNode结点中有两个部分,分别具体的数据(即:data域)和next域,这个新建的HeroNode结点的next域又指向下一个HeroNode2结点,若还有一个HeroNode3结点,则让前一个HeroNode2结点的next域指向后一个HeroNode3结点。这样就形成了一个链表。若最后一个HeroNode3结点不再指向任何结点了,那这最后一个HeroNode3结点的next域默认为null

总结创建(添加)单链表步骤:

第一步,先创建一个head结点,作用就是用来连接整个链表,表示单链表的头

第二步,后面每添加一个结点,就直接加入到链表的最后

问题:

  1. 怎么去判断链表中的哪一个是最后的结点呢?

    答:是以判断结点的next域是否为空来决定这个链表是否结束

遍历显示单链表的思路分析:

遍历时,通过定义一个临时变量(或者叫做辅助指针),帮助遍历整个单链表,因为head结点不能动,若head头结点变化了,就找不到链表最后那个结点了.


用代码分析实现单向链表

链表最重要的就是增删改查

  1. 首先定义一个HeroNode类,每个HeroNode对象就是一个结点

    代码实现:

    class HeroNode {
         
          
        // 编写属性(共4个)
        // data域 用来存放具体的数据
        public int id;
        public String name;
        public String nickName;
        // next域  用来指向下一个结点
        public HeroNode next;  // 最重要的一个属性
        // 无参构造
        public HeroNode() {
         
          
            
        }
        // 带参构造,实现将局部变量的值赋值给成员变量
        public HeroNode(int id,String name,String nickName) {
         
          
            // 对属性进行初始化
            this.id  = id;
            this.name = name;
            this.nickName = nickName;
        }
        // 重写toString()方法,为了显示 | 遍历方便
        @Override
        public String toString() {
         
          
            return "HeroNode{" +
                    
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41473905/article/details/103560238

智能推荐

nvl函数不生效(bug记录)_nvl函数没用-程序员宅基地

文章浏览阅读197次。nvl(表达式A,表达式B)_nvl函数没用

前端配置环境_vscode已为屏幕阅读器优化-程序员宅基地

文章浏览阅读965次。Sublime配置软件安装点击官网下载插件安装新版的sublime已经默认安装了package control,我们可以通过package control 安装适合自己的插件。如果没有安装package control,直接按command + shift + p 唤出命令列表,(windows用户把command键改为crtl键)输入install,点击install package control,耐心等待安装好package control会有弹框提示。以下三步为安装插件的方法:在s_vscode已为屏幕阅读器优化

快乐学Python,数据分析之使用爬虫获取网页内容_python获取鼠标下网页内容-程序员宅基地

文章浏览阅读1.6k次,点赞32次,收藏19次。造成这个现象的原因是豆瓣电视剧网页中的电视剧列表的部分是动态加载的,所以我们用 urllib3 去直接下载,只能下载到一个壳网页,没有里面的列表内容。对于煎蛋这类普通网页,urllib3 可以表现更好,但是有一种类型的网页,它的数据是动态加载的,就是先出现网页,然后延迟加载的数据,那 urllib3 可能就有点力不从心了。动态网页应该怎么抓取呢?执行上述代码,可以看到打印出了非常多的内容,而且很像我们第一部分手动保存的网页,这说明目前 html_content 变量中保存的就是我们要下载的网页内容。_python获取鼠标下网页内容

加密解密(三)--Java中的非对称加密算法_publickey.getencoded()多出一部分-程序员宅基地

文章浏览阅读911次。非对称加密算法是一种密钥的保密方法。非对称加密算法需要两个密钥:公开密钥(public key)和私有密钥(private key)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 非对称加密算法实现机密信息交换的基本过程_publickey.getencoded()多出一部分

通往未来的数字大道:解读政府工作报告中的计算机行业发展路径-程序员宅基地

文章浏览阅读539次,点赞15次,收藏10次。政府工作报告作为政府工作的全面总结和未来规划,不仅反映了国家整体的发展态势,也为各行各业提供了发展的指引和参考。随着信息技术的快速发展,计算机行业已经成为推动经济社会发展的重要引擎之一。因此,从政府工作报告中探寻计算机行业的发展趋势、政策导向和未来机遇,对于行业内的企业和从业者来说具有重要的指导意义。

SSL编程指南_sslv23-程序员宅基地

文章浏览阅读1.3w次,点赞16次,收藏83次。本文将介绍如何使用openssl APIs 实现一个简单的SSL 客户端和服务端虽然SSL客户端和服务端在创建和配置上有所区别,但它们本质上的步骤可以总结为如下图,具体步骤将在后面章节介绍:初始化SSL库在SSL应用程序中调用其他Openssl APIs,需要先用下面的APIs进行初始化:SSL_library_init(); /* 为SSL加载加密和哈希算法 */_sslv23

随便推点

GPT-3 模型-程序员宅基地

文章浏览阅读261次。GPT-3 (Generative Pre-training Transformer 3) 是由 OpenAI 开发的一种大型语言生成模型。它可以用来进行文本生成、翻译、问答等任务。GPT-3 使用了 Transformer 架构,并在大量的网络数据上进行了预训练,使其能够从历史数据中学习到语言的结构和模式。GPT-3 具有非常强大的生成能力,能够生成高质量的人类-like 文本。它目前是市面上规..._gpt-3模型

【嵌入式开发】481-程序员宅基地

文章浏览阅读704次,点赞13次,收藏6次。在嵌入式开发中,I2C(Inter-Integrated Circuit)总线常用于连接微控制器与各种外围设备,其中EEPROM(Electrically Erasable Programmable Read-Only Memory,电可擦除可编程只读存储器)是I2C总线上常见的存储器件之一。读写EEPROM时,主设备首先发送起始信号,然后发送EEPROM的设备地址和读写位。在实际使用中,开发者需要根据具体的EEPROM型号和数据手册来确定正确的地址、页大小和读写时序等参数。在上述代码中,我们定义了。

oracle rac 内存耗尽,粗浅记录Oracle RAC系统内存无法释放-程序员宅基地

文章浏览阅读536次。交代一下环境,是现网实时生产数据库主机。Hp-ux 11.31+Oracle10.2.0.4.0 RAC集群。两台机器户外RAC,essdb3与essdb4两台机器。物理内存128G,SGA分配64G,PGA分配5G。早上发现essdb4主机glance运行只有6G的空闲内存。使用如下命令进行简单分析:sql> select distinct sid from v$mystat; 得到sid...

x86汇编 linux,Linux操作系统的X86汇编程序设计-程序员宅基地

文章浏览阅读252次。本质上来说, 这篇文章是把我最感兴趣的两样编程东西: Linux 操作系统和汇编语言程序设计结合在一起. 这两个都不(或者说应该不)需要介绍; 像 Win32 的汇编,Linux 的汇编运行在 32 位的保护模式下...但它又有一个截然不同的优势就是它允许你调用 C 的标准库函数和 Linux 的共享库函数。 我开始给 Linux 下的汇编语言编程来个简要介绍; 为了更好读一点, 你可能要跳过这个..._精简32位linux操作系统在x86上的设计与实现

kimi 初体验_kimi api-程序员宅基地

文章浏览阅读1.2k次,点赞6次,收藏5次。国产kimi 来了,它的一个优点是使用openai api。不需要虚拟卡充值等麻烦了。_kimi api

如何将word图片粘贴到帝国CMS里面-程序员宅基地

文章浏览阅读61次。/在ctrl+c word中的文字或者图片之后会返回1种(image/png)或者4种type(text/plain,text/html,text/rtf,image/png)类型的对象。//如下代码:e.originalEvent.clipboardData.items获得剪贴板的内容。//如果有文字的话不做任何的处理,如果只粘贴图片的话文本一定是空的,包括复制的桌面图片或者截图的图片。//当粘贴了文本之后text是不为空的,同时也会返回当前文本的图片类型。//为了兼容4种格式的情况,做了如下的判断。

推荐文章

热门文章

相关标签