【链表的说明、方法---顺序表与链表的区别】

文章目录

  • 前言
    • 什么是链表
    • 链表的结构
    • 带头和不带头的区别
  • 链表的实现(方法)
    • 遍历链表
    • 头插法
    • 尾插法
    • 任意位置插入一个节点
    • 链表中是否包含某个数字
    • 删除链表某个节点
    • 删除链表中所有关键字key
    • 清空链表所有节点
  • ArrayList 和 LinkedList的区别
  • 总结


前言

什么是链表

含义:链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。

图形解释:
逻辑上是连续的,但物理上看起来不连续
这个图形也叫单向不带头非循环
在这里插入图片描述

链表的结构

非常多样,有8种结构
在这里插入图片描述
在这里插入图片描述

重点掌握下面两种:

无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。

无头双向链表:在Java的集合框架库中LinkedList底层实现就是无头双向循环链表。

带头和不带头的区别

在这里插入图片描述

链表的实现(方法)

在这里插入图片描述

在这里插入图片描述
定义接口

public interface ILIst {// 1、无头单向非循环链表实现//头插法void addFirst(int data);//尾插法void addLast(int data);//任意位置插入,第一个数据节点为0号下标void addIndex(int index,int data);//查找是否包含关键字key是否在单链表当中public boolean contains(int key);//删除第一次出现关键字为key的节点void remove(int key);//删除所有值为key的节点void removeAllKey(int key);//得到单链表的长度int size();void clear();void display();
}

遍历链表

在这里插入图片描述

1.怎么从一个节点走到下一个节点
head = head.next

2.怎么判断所有节点遍历完了
当head = null 循环结束


//            while(head != null){
//                System.out.print(head.val+" ");
//                head = head.next;
//            }//这个方法遍历完head=null,会导致链表空了,找不到第一个节点在哪了
//所以应该把head赋值给一个数,让它去遍历,相当于head的分身,分身消失了,主体head还在ListNode cur = this.head;//进入循环条件为链表不为空//也就是说当head为空时,循环结束while(cur != null){System.out.print(cur.val+" ");cur =cur.next;}

头插法

    //头插法//时间复杂度O(1)@Overridepublic void addFirst(int data) {//先实例化一个节点ListNode node = new ListNode(data);//如果链表没有节点,那么插入的这个节点就是第一个节点//所以head = nodeif (this.head ==null){this.head = node;}else {node.next = this.head;this.head = node;}}

在这里插入图片描述

尾插法

在这里插入图片描述

    //尾插法:在最后创建一个节点//时间复杂度O(N)@Overridepublic void addLast(int data) {//创建一个新节点ListNode node = new ListNode(data);ListNode cur = this.head;//当链表为空时,此案件的新节点就是第一个节点if (this.head == null){this.head = node;}else {//让cur遍历完走到cur.next为空时,才找到了最后一个节点//意思就是走出了while循环,就说明cur走到了最后一个节点上while (cur.next != null){cur = cur.next;}cur.next = node;node.next =null;}}

在这里插入图片描述

任意位置插入一个节点

在这里插入图片描述

    //让cur去到index-1位置private ListNode searchPrev(int index){ListNode cur = this.head;int count =0;while(count != index-1){cur = cur.next;count++;}//循环走完, cur已经走到index-1得位置了return cur;}//任意位置插一个节点@Overridepublic void addIndex(int index, int data) {ListNode node = new ListNode(data);//检查index得合法性if (index < 0 || index > size()){//抛自定义异常return ;}//如果index=0 头插法if (index == 0){addFirst(data);return;}//如果index=size,尾插法if (index == size()){addLast(data);return;}ListNode cur =  searchPrev(index);//调用cur走到index-1的方法node.next = cur.next;cur.next = node;}

链表中是否包含某个数字

    //链表是否包含某个数字@Overridepublic boolean contains(int key) {ListNode cur = this.head;while(cur != null){if (cur.val == key){return true;}cur = cur.next;}return false;}@Overridepublic void remove(int key) {}

删除链表某个节点

在这里插入图片描述

    //让cur走到要删除的节点的前一个节点private ListNode findPrev(int key){ListNode cur = this.head;//判断条件是cur不能超过倒数二个节点while(cur.next != null ){if (cur.next.val == key){return cur;}cur = cur.next;}return null;}@Overridepublic void remove(int key) {//如果链表为空,无法删除if (this.head == null){return ;}//如果要删除第一个节点if (this.head.val ==key){this.head = this.head.next;return;}//判断前驱ListNode cur = findPrev(key);//判断返回值是否为空if (cur == null){System.out.println("没有你要删除的数字!");return ;}//删除ListNode del = cur.next;cur.next = del.next;}

删除链表中所有关键字key

在这里插入图片描述

    //删除链表中所有关键字key@Overridepublic void removeAllKey(int key) {if (this.head == null){return;}ListNode prev = this.head;ListNode cur = this.head.next;while(cur != null){if (cur.val == key){prev.next = cur.next;cur = cur.next;}else{prev = cur;cur = cur.next;}}if (this.head.val == key){this.head = head.next;}}

清空链表所有节点

在这里插入图片描述

    public void clear() {ListNode cur = this.head;while(cur != null){ListNode curNext  = cur.next;cur.next =null;cur = curNext;}this.head = null;}

ArrayList 和 LinkedList的区别

在这里插入图片描述

总结

以上就是关于链表的详细知识。

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

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

相关文章

整套数字化招采平台安全防御体系

招采平台作为数字化供应链的重要组成部分&#xff0c;需要确保招标采购过程的安全性,主体信息和交易数据信息尤为重要,通过必要的安全架构、技术和安全管理制度&#xff0c;做到事前防范、事中监管和事后审计的安全防御。 一、平台技术安全架构 1、先进的技术架构&#xff0c…

Latex学习

二 实例 1. \Delta_{w}\frac{\partial l}{\partial w_{i1}}weight:\frac{\partial l}{\partial x_{i1}} 效果如下 其中对于希腊字母的大小写来说&#xff0c;可以参考&#xff1a; 【LaTeX 语法】字母表示 ( 大写、小写、异体 希腊字母 | 粗体字母 | 花体字母 )_latex字母_韩…

Centos8部署LNMP架构

LNMP架构 LNMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写。L指Linux&#xff0c;N指Nginx&#xff0c;M一般指MySQL&#xff0c;也可以指MariaDB&#xff0c;P一般指PHP&#xff0c;也可以指Perl或Python。 1.Linux是一类Unix计算机操作系统的统称…

09【保姆级】-GO语言的数组和切片

09【保姆级】-GO语言的数组 一、数组1.1 数组定义1.2 数组的使用1.3 数组的遍历1.4 数组的应用案例 二、切片2.1 切片的介绍2.2 切片的原理2.3 切片的三种使用 之前我学过C、Java、Python语言时总结的经验&#xff1a; 先建立整体框架&#xff0c;然后再去抠细节。先Know how&a…

Spring框架学习 -- 创建与使用

目录 (1) 创建spring 项目 ① 创建maven项目 ②添加spring框架支持 ③ 添加启动项 (2) 创建 Bean对象 (3) 将Bean注入到容器 (4) 获取Bean对象 (5) 注意事项 (6) Spring的创建和使用流程图 创作不易多多支持 (1) 创建spring 项目 首先我们使用的开发工具为idea 专业版…

为什么原生IP可以降低Google play账号关联风险?企业号解决8.3/10.3账号关联问题?

在Google paly应用上架的过程中&#xff0c;相信大多数开发者都遇到过开发者账号因为关联问题&#xff0c;导致应用包被拒审和封号的情况。 而众所周知&#xff0c;开发者账号注册或登录的IP地址及设备是造成账号关联的重要因素之一。酷鸟云最新上线的原生IP能有效降低账号因I…

时间序列预测(9) — Informer源码详解与运行

目录 1 源码解析 1.1 文件结构 1.2 mian_informer.py文件 1.3 模型训练 1.4 模型测试 1.5 模型预测 2 Informer模型 2.1 process_one_batch 2.2 Informer函数 2.3 DataEmbedding函数 2.4 ProbAttention稀疏注意力机制 2.5 Encoder编码器函数 2.6 Decoder解码器函数…

PG数据中DBeaver上传csv文件作为数据表

DBeaver 是一个开源的数据库工具&#xff0c;还是蛮好用的&#xff0c;有时候需要我们上传数据做表&#xff0c;数据为CSV格式的&#xff0c;DBeaver本身自带有功能实现的。 可打开连着的数据库&#xff0c;找到模式&#xff0c;点到下面的表里&#xff0c;选择一个表直接导入…

【Linux系统化学习】进程优先级 | 进程饥饿 | 进程切换

个人主页点击直达&#xff1a;小白不是程序媛 Linux专栏&#xff1a;Linux系统化学习 目录 进程优先级 什么是优先级&#xff1f; 为什么会有优先级&#xff1f; 如何做到的&#xff1f; 优先级的动态调整 查看进程优先级的命令 PRI 和 NI PRI VS NI 修改进程优先级 …

FreeRTOS内存管理分析

目录 heap_1.c内存管理算法 heap_2.c内存管理算法 heap_3.c内存管理算法 heap_4.c内存管理算法 heap_5.c内存管理算法 内存管理对应用程序和操作系统来说非常重要&#xff0c;而内存对于嵌入式系统来说是寸土寸金的资源&#xff0c;FreeRTOS操作系统将内核与内存管理分开实…

Redis:新的3种数据类型Bitmaps、HyperLoglog、Geographic

目录 Bitmaps简介常用命令bitmaps与set比较 HyperLoglog简介命令 Geographic简介命令 Bitmaps 简介 位操作字符串。 现代计算机使用二进制&#xff08;位&#xff09;作为信息的基本单位&#xff0c;1个字节等于8位&#xff0c;例如“abc”字符串是有3个字节组成&#xff0c…

Parallel Diffusion Models of Operator and Image for Blind Inverse Problems

盲逆问题算子和图像的并行扩散模型 论文链接&#xff1a;https://arxiv.org/abs/2211.10656 项目链接&#xff1a;https://github.com/BlindDPS/blind-dps Abstract 在正向算子已知的情况下(即非盲)&#xff0c;基于扩散模型的逆问题求解器已经展示了最先进的性能。然而&…

css鼠标横向滚动并且不展示滚动条几种方法

需求&#xff1a;实现内容超出之后使用属性滚轮进行左右查看超出内容&#xff0c;并且隐藏滚动条 1.不使用框架实现 每次滚动就滚动40px的距离 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name&quo…

STM32——STM32Cubemx的学习使用总结

文章目录 一、简介二、STM32Cube IDE与MX区别&#xff1f;三、界面介绍和使用四、使用整体框架 一、简介 STM32CubeMX是一个图形化工具&#xff0c;可以非常容易地配置STM32微控制器和微处理器&#xff0c;以及为ArmCortex-M 内核或部分 Linux 设备树生成相应的初始化C代码&…

编译器优化代码研究

《Effective C》条款21&#xff1a; /** * 结论&#xff1a;对自定义类型对象表达式objA*objB objC; * 定义friend MyInt operator*(const MyInt& lhs,const MyInt& rhs) * 编译器优化后&#xff1a;operator*()函数内直接在调用接收处构造(此处的匿名临时对象)&am…

CANopen权威指南【CAN总线协议】

1这个总线定义是老外发明的。 想要使用&#xff0c;就必须按照协议去配置数据帧。 CIA301和cia402协议&#xff0c;实际就是寄存器地址上某一段的定义。 下载地址&#xff1a; CAN in Automation (CiA): Technical documents 注册下载也是非常快的。【没什么难度】 就是资…

HTTP响应详解

HTTP响应格式 HTTP响应报文通常由四个部分组成: 响应行(Response Line):包含协议版本、状态码和状态消息,例如:HTTP/1.1 200 OK。 响应头(Response Headers):包含了一系列的键值对,用来描述关于响应的信息,比如内容类型、日期、服务器信息等等。 空行:即CRLF(回车…

关于使用Java-JWT的笔记

Token的组成规则 一个token分三部分&#xff0c;按顺序为&#xff1a;头部&#xff08;header)&#xff0c;载荷&#xff08;payload)&#xff0c;签证&#xff08;signature) 由三部分生成token &#xff0c;三部分之间用“.”号做分隔。 例如&#xff1a;“eyJhbGciOiJIUzI1…

完全二叉树你需要了解一下

完全二叉树介绍完全二叉树应用场景完全二叉树和满二叉树的区别完全二叉树代码示例拓展 完全二叉树介绍 完全二叉树&#xff08;Complete Binary Tree&#xff09;是一种特殊的二叉树&#xff0c;它的定义是&#xff1a;如果设二叉树的深度为h&#xff0c;除第h层外&#xff0c…

博主都在用的网站,一键制作电子杂志

​随着互联网的发展&#xff0c;越来越多的人开始使用电子杂志来展示自己的作品或宣传自己的品牌。而制作电子杂志的工具也越来越多&#xff0c;其中一些工具非常受欢迎&#xff0c;被许多博主使用。今天&#xff0c;我们就来介绍一款博主都在用的网站&#xff0c;它可以帮助你…