数据结构 - 单链表
文章目录
目录
文章目录
一、什么是链表?
线性表:
顺序表:
二、链表的分类和实现
分类:
实现:
1.创建节点类
2.创建单链表
1.addTail(尾增)
2.删除节点值为key的第一个节点
3.插入节点(在指定位置)
4.获取链表长度
总结
前言
大家好,这篇博客给大家讲一下什么是链表以及单链表的实现过程
一、什么是链表?
再讲解什么是链表时,先给大家讲一下大体上的分类线性表和顺序表
线性表:
线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结 构,常见的线性表:链表、栈、队列... 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物 理上存储时,通常以数组和链式结构的形式存储。

可以看到链表在内存中并不是连续的,只是在逻辑上是连续的,链表中的节点见缝插针般的在内存中存储
顺序表:
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成 数据的增删查改。
二、链表的分类和实现
分类:
链表根据是否包含头结点来分可以分为两类,根据是否循环来分也可以分为两类
其中循环和非循环相对来说差别不大,下面我们将围绕是否包含头节点来进行谈论
问题1:含头节点的链表和不含头节点的链表有什么不同?

带头结点的链表的第一个节点不存数据,实现起来相对比较容易
不带头结点的第一个节点就是数据节点,实现起来比带头结点的难一些,并且是刷题和面试的重点
下面我将带大家来实现最经典的单链表:不带头节点的非循环链表
实现:
思路分析:
1.创建节点类Node,用来表示链表中的节点
2.创建单链表 SingleList
3.实现方法 增,删,查.......
1.创建节点类
来思考一下节点类中应该存在的信息?
日常工作生活中节点中记录的信息是多种多样的,为了简单起见我们按最简单的来,即节点中只包含
val和指向下一个节点的指针next
class Node{public int val;public Node next;public Node(int val){this.val = val;}
}
2.创建单链表
有了节点类,我们就可以把一个个节点组合起来,组合成为一个在逻辑上是连续的链表了
那么在单链表中应该存在什么呢?
首先应该有个头结点,要不然无法知道链表从哪里开始,也不能将链表作为参数传递出去
其次应该有构造方法,不然写这么个链表就会毫无意义
还有就是一些方法,基础代码给出,下面我们来一个一个实现方法
public class SingleListDemo {private Node head;public SingleListDemo(){}}class Node{public int val;public Node next;public Node(int val){this.val = val;}
}
1.addTail(尾增)
public void addTail(int val) {Node newNode = new Node(val);if (head == null) {head = newNode;return;}Node cur = head;while (cur.next != null) {cur = cur.next;}cur.next = newNode; }

在这里我们可以延伸出在头部插入节点的情况,即将新的节点的next指针指向头结点,将头结点的指向更改为新的节点即可
2.删除节点值为key的第一个节点
// 删除节点的Data值为key的第一个节点
public void DeleteKey(int key) {// 判断链表是否为空if (head == null) {System.out.println("链表为空");return;}// 判断第一个节点是否是要删除的节点if (head.val == key) {HeadDelete();return;}Node cur = head;while (cur.next != null) {if (cur.next.val == key) {cur.next = cur.next.next;return;}cur = cur.next;}
}
拓展: 删除值为key的所有节点,要求时间复杂度不超过O(n)
// 法一 循环遍历
public void Delete(int Data) {if (head == null) {return;}while (head.val == Data) {head = head.next;if (head == null) {return;}}Node cur = head;// 定义临时节点代替头结点遍历链表并删除元素while (true) {if (cur.next == null) {return;}if (cur.next.val == Data) {System.out.println("删除成功!");cur.next = cur.next.next;continue;}cur = cur.next;}}// 法二 - 双指针
public void Delete2(int Data) {if (head == null) {return;}Node pre = head;Node cur = head.next;while (cur != null) {if (cur.val == Data) {pre.next = cur.next;} else {pre = cur;}cur = cur.next;}if (head.val == Data) {head = head.next;}
}
3.插入节点(在指定位置)
// 在指定位置插入节点,第一个节点为0号下标
public void InsertAny(int index, int val) {// 判断链表下标是否合法if (index < 0 && index > getSize()) {System.out.println("下标不合法!");return;}if (index == 0) {HeadAdd(val);return;}Node node = new Node(val);Node cur = head;// 遍历链表找到下标为index-1的元素while (index > 1) {//index-1index--;cur = cur.next;}node.next = cur.next;cur.next = node;
}
4.获取链表长度
public int getSize() {Node node = head;int size = 0;while (node != null) {node = node.next;size++;}return size;
}
以上就是一些比较重要的方法了,下期见。
总结
大家多多刷题吧,链表可是面试中笔试题的重点!
相关文章:
数据结构 - 单链表
文章目录 目录 文章目录 一、什么是链表? 线性表: 顺序表: 二、链表的分类和实现 分类: 实现: 1.创建节点类 2.创建单链表 1.addTail(尾增) 2.删除节点值为key的第一个节点 3.插入节点(在指定位置) 4.获取链表长度 总结 前言 大家好,这篇博客给大家讲一下什么是…...
化繁为简 面板式空调网关亮相上海智能家居展 智哪儿专访青岛中弘赵哲海
面对中央空调协议不开放和智能家居协议不统一的问题,青岛中弘选择中央空调控制器这一细分赛道入局智能家居市场,始终贯彻“所有空调,一个网关”的产品技术理念,逐渐探索出一条中弘的发展路径和商业模式。 在2023年的SSHT上海国际智…...
4G版本云音响设置教程阿里云平台版本
4G版本云音响设置教程介绍 第一章 介绍了在阿里云物联网平台生一个设备使用的三元素 第二章 转换阿里云三元素 为MQTT参数,并下载到设备中 第三章 阿里云物联网套件协议使用说明,如何发送数据至设备并播放 本文目录引导 目录 4G版本云音响设置教程介…...
STM32纯中断方式发送接收数据(串行通信;keil arm5;)
除了main文件其他文件均无修改,正常运行--在keil arm5内...
FPGA时序分析与约束(3)——时钟不确定性
一、前言 在之前的文章中,我们介绍了组合电路的时序和时序电路的时序问题,在阅读本文章之前,强烈推荐先阅读完本系列之前的文章,因为这是我们继续学习的理论的理论基础,前文链接: FPGA时序分析与约束&…...
【Java-HDFS】使用Java操作HDFS获取HDFS指定目录下的数据量大小
Maven依赖 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>RELEASE</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId>…...
协议定制 + Json序列化反序列化
文章目录 协议定制 Json序列化反序列化1. 再谈 "协议"1.1 结构化数据1.2 序列化和反序列化 2. 网络版计算器2.1 服务端2.2 协议定制(1) 网络发送和读取的正确理解(2) 协议定制的问题 2.3 客户端2.4 代码 3. Json实现序列化反序列化3.1 简单介绍3.2 使用 协议定制 J…...
系统架构设计师(第二版)学习笔记----系统架构概述
【原文链接】系统架构设计师(第二版)学习笔记----系统架构概述 文章目录 一、系统架构的定义与发展历程1.1 架构的定义1.2 架构设计的作用1.3 架构设计产生的背景1.4 软件架构的发展历程1.5 模块化开发方法1.6 模块法方法分解模块遵循的原则1.7 软件工程…...
FPGA基本算术运算
FPGA基本算术运算 FPGA基本算术运算1 有符号数与无符号数2 浮点数及定点数I、定点数的加减法II、定点数的乘除法 3 仿真验证i、加减法验证ii、乘除法验证 FPGA基本算术运算 FPGA相对于MCU有并行计算、算法效率较高等优势,但同样由于没有成型的FPU等MCU内含的浮点数运…...
Linux Input子系统
一、基本概念 按键、鼠标、键盘、触摸屏等都属于输入(input)设备,Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件。本质属于字符设备。 1. input子系统结构如下: input 子系统分为 input 驱动层、input 核心层、input 事件处理层&…...
commet与websocket
commet与websocket Comet 前言 Comet是一种用于web的技术,能使服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求,目前有两种实现方式,长轮询和iframe流。 实现方式 长轮询 长轮询是在打开一条连接以后保持&…...
python3 简易 http server:实现本地与远程服务器传大文件
在个人目录下创建新文件httpserver.py : vim httpserver.py文件内容为python3代码: # !/usr/bin/env python3 import datetime import email import html import http.server import io import mimetypes import os import posixpath import re import…...
Microsoft Edge 主页启动diy以及常用的扩展、收藏夹的网站
一、Microsoft Edge 主页启动diy 二、常用的扩展 1、去广告:uBlock Origin 2、翻译: 页面翻译:右键就有了,已经内置了划词翻译 3、超级复制 三、收藏夹的网站...
文末送书!谈谈原型模式在JAVA实战开发中的应用(附源码+面试题)
作者主页:Designer 小郑 作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN博客专家,蓝桥云课认证讲师。 本文讲解了 Java 设计模式中的原型模式,并给…...
视频汇聚/视频云存储/视频监控管理平台EasyCVR启动时打印starting server:listen tcp,该如何解决?
视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、H.265自动转码H.264、平台级联等。为了便于用户二次开发、调用与集成,…...
【Linux从入门到精通】通信 | 管道通信(匿名管道 命名管道)
本派你文章主要是对进程通信进行详解。主要内容是介绍 为什么通信、怎么进行通信。其中本篇文章主要讲解的是管道通信。希望本篇文章会对你有所帮助。 文章目录 一、进程通信简单介绍 1、1 什么是进程通信 1、2 为什么要进行通信 1、3 进程通信的方式 二、匿名管道 2、1 什么是…...
实践和项目:解决实际问题时,选择合适的数据结构和算法
文章目录 选择合适的数据结构数组链表栈队列树图哈希表 选择合适的算法实践和项目 🎉欢迎来到数据结构学习专栏~实践和项目:解决实际问题时,选择合适的数据结构和算法 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页:IT…...
上线检查工具(待完善)
根据V11《CEBPM系统上线CheckList》整理而得,适用于V11,DHERP,Oracle和MSSQL数据库,检查内容还不完善。 上图: 1)数据库连接 2)双击[连接别名],可选择历史连接 3)主界面…...
PE文件格式详解
摘要 本文描述了Windows系统的PE文件格式。 PE文件格式简介 PE(Portable Executable)文件格式是一种Windows操作系统下的可执行文件格式。PE文件格式是由Microsoft基于COFF(Common Object File Format)格式所定义的,…...
【Alibaba中间件技术系列】「RocketMQ技术专题」RocketMQ消息发送的全部流程和落盘原理分析
RocketMQ目前在国内应该是比较流行的MQ 了,目前本人也在公司的项目中进行使用和研究,借着这个机会,分析一下RocketMQ 发送一条消息到存储一条消息的过程,这样会对以后大家分析和研究RocketMQ相关的问题有一定的帮助。 分析的总体…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...
从零开始了解数据采集(二十八)——制造业数字孪生
近年来,我国的工业领域正经历一场前所未有的数字化变革,从“双碳目标”到工业互联网平台的推广,国家政策和市场需求共同推动了制造业的升级。在这场变革中,数字孪生技术成为备受关注的关键工具,它不仅让企业“看见”设…...
