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

文章目录

  • 前言
    • 什么是链表
    • 链表的结构
    • 带头和不带头的区别
  • 链表的实现(方法)
    • 遍历链表
    • 头插法
    • 尾插法
    • 任意位置插入一个节点
    • 链表中是否包含某个数字
    • 删除链表某个节点
    • 删除链表中所有关键字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)
    @Override
    public void addFirst(int data) {
            //先实例化一个节点
        ListNode node = new ListNode(data);
        //如果链表没有节点,那么插入的这个节点就是第一个节点
        //所以head = node
        if (this.head ==null){
            this.head = node;
        }else {
            node.next = this.head;
            this.head = node;

        }
    }

在这里插入图片描述

尾插法

在这里插入图片描述

    //尾插法:在最后创建一个节点
    //时间复杂度O(N)
    @Override
    public 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;
    }

    //任意位置插一个节点
    @Override
    public 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;
    }

链表中是否包含某个数字

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

    @Override
    public 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;

    }
    @Override
    public 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
    @Override
    public 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的区别

在这里插入图片描述

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Ubuntu】Ubuntu arm64 部署 Blazor Server 应用

部署步骤 发布安装运行环境&#xff1a;dotnet-sdk&#xff08;必装&#xff09;、aspnetcore-runtime、dotnet-runtime安装证书设置环境变量&#xff1a;临时变量、当前用户永久变量、所有用户的永久变量运行&#xff1a;终端运行、后台运行 基本情况 开发系统环境 系统&am…

RabbitMQ消息队列快速入门

RabbitMQ消息队列快速入门 初始MQ MQ全称为Message Queue&#xff0c;即消息队列&#xff0c;是在消息的传输过程中保存消息的容器。它是典型的生产者-消费者模型。 生产者不断向消息队列中生产消息&#xff0c;消费者不断的从队列中获取消息。消息的生产和消费都是异步的&am…

SQL DELETE 语句:删除表中记录的语法和示例,以及 SQL SELECT TOP、LIMIT、FETCH FIRST 或 ROWNUM 子句的使用

SQL DELETE 语句 SQL DELETE 语句用于删除表中的现有记录。 DELETE 语法 DELETE FROM 表名 WHERE 条件;注意&#xff1a;在删除表中的记录时要小心&#xff01;请注意DELETE语句中的WHERE子句。WHERE子句指定应删除哪些记录。如果省略WHERE子句&#xff0c;将会删除表中的所…

战备器材管理系统-部队物资仓库管理系统

一、项目背景 传统的战备物资管理&#xff0c;一般依赖于一个非自动化的、以纸张文件为基础的系统来记录、追踪进出的货物&#xff0c;完全由人工实施仓库内部的管理&#xff0c;因此仓库管理的效率极其低下。对此&#xff0c;我们运用无线射频技术(RFID)的仓库智能管理系统&am…

Fiddler抓包看这篇就够了:fiddler设置弱网测试

弱网测试 概念&#xff1a;弱网看字面意思就是网络比较弱&#xff0c;我们通称为信号差&#xff0c;网速慢。 意义&#xff1a;模拟在地铁、隧道、电梯和车库等场景下使用APP &#xff0c;网络会出现延时、中断和超时等情况。 自动化测试相关教程推荐&#xff1a; 2023最新自…

基于单片机加热炉多参数检测和PID炉温系统

**单片机设计介绍&#xff0c; 基于单片机加热炉多参数检测和PID炉温系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的公交安全预警系统可以被设计成能够实时监测公交车辆的行驶状态&#xff0c;并在发生异常情况…

金蝶云星空套打设计

文章目录 金蝶云星空套打设计下载登录打开需要创建套打的单据新建套打模板数据中心-发货通知单-设置预览 金蝶云星空套打设计 下载 登录 打开需要创建套打的单据 KD开头&#xff0c;是标准产品预设。 新建套打模板 默认A4纸 默认插入三行三列。 拖入文本&#xff0c;填写内容…

计算机基础知识54

ORM的介绍 # ORM是什么&#xff1f; 我们在使用Django框架开发web应用的过程中&#xff0c;不可避免地会涉及到数据的管理操作&#xff08;增、删、改、查&#xff09;&#xff0c;而一旦谈到数据的管理操作&#xff0c;就需要用到数据库管理软件&#xff0c;例如mysql、oracle…

map的基础定义及运用

Map 1 使用 1 声明 /*声明map*/map<int, string> myMap {{1, "Apple"}, {2, "Banana"}, {3, "Orange"}};2 插入元素 myMap.insert(make_pair(4, "Graphes"));3 通过访问键查找和访问元素 cout << myMap[2] <<…

Ubuntu Server download

前言 Ubuntu——公共云、数据中心和边缘上最受欢迎的 Linux 发行版。自成立以来&#xff0c;Ubuntu 一直在获得市场份额&#xff0c;截至今天已接近 50%。 Ubuntu Server download VersionUbuntu Server 其它主机型号版本Ubuntu AMD历史版下载百度云Ubuntu Server all Ubuntu…

小白也能看懂的国内外 AI 芯片概述

随着越来越多的企业将人工智能应用于其产品&#xff0c;AI芯片需求快速增长&#xff0c;市场规模增长显著。因此&#xff0c;本文主要针对目前市场上的AI芯片厂商及其产品进行简要概述。 简介 AI芯片也被称为AI加速器或计算卡&#xff0c;从广义上讲只要能够运行人工智能算法…

本机idea连接虚拟机中的Hbase

相关环境&#xff1a; 虚拟机&#xff1a;Centos7 hadoop版本:3.1.3 hbase版本:2.4.11 zookeeper版本:3.5.7 Java IDE:IDEA JDK&#xff1a;8 步骤 步骤一&#xff1a;在idea创建一个maven项目 步骤二&#xff1a;在虚拟机里找到core-site.x…

【C++】map multimap

文章目录 1.map介绍2.map的使用3.multimap介绍4.multimap的使用 1.map介绍 map的文档 翻译&#xff1a; map是关联容器&#xff0c;它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。 在map中&#xff0c;键值key通常用于排序和惟一地标识元素&#x…

四川芸鹰蓬飞:抖店运营的时候注意什么?

抖店作为一个短视频平台&#xff0c;吸引了越来越多的商家加入。在抖店上进行有效的运营是提高销量和曝光度的关键。那么&#xff0c;抖店怎么设置运营呢&#xff1f;有哪些方法可以帮助商家在这个竞争激烈的平台上脱颖而出呢&#xff1f; 一、抖店怎么设置运营&#xff1f; 首…

VC++添加包含目录

安装了QT;它带有很多例子; 新建一个工程,添加一个C++源文件,随便拷个例子的源码过来; 然后VS会提示头2个include语句出错; 因为找不到这两个头文件;这需要添加包含目录; 进入项目属性页;VC++目录 - 包含目录,它之前有2个系统的值;点击右侧的下拉箭头按钮,点…

天空分割技术解决方案

图像处理技术已经成为企业提升用户体验、优化产品和服务的重要工具。美摄科技&#xff0c;作为全球领先的AI图像处理技术提供商&#xff0c;一直致力于研发和应用最先进的技术&#xff0c;以满足企业的各种需求。今天&#xff0c;我们很高兴地向大家介绍我们的新一代产品——美…

【PTA题目】L1-4 稳赢 分数 15

L1-4 稳赢 分数 15 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 大家应该都会玩“锤子剪刀布”的游戏&#xff1a;两人同时给出手势&#xff0c;胜负规则如图所示&#xff1a; 现要求你编写一个稳赢不输的程序&#xff0c;根据对方的出招&#xff0c;给出对应的赢招。但…

AR远程辅助技术应用到气象部门有何好处?

随着科技的不断发展&#xff0c;人类对于自然环境的理解和掌控能力也在不断提升。其中&#xff0c;AR(增强现实)技术的应用&#xff0c;为气象监控带来了革命性的变化。AR气象远程监控&#xff0c;就是将AR技术与气象监控相结合&#xff0c;通过虚拟与现实的融合&#xff0c;实…

数字化转型导师坚鹏:数字化时代银行网点厅堂营销5大痛点分析

数字化时代银行网点厅堂营销存在以下5大痛点&#xff1a; 1、业务办理时间较长。目前很多银行业务办理时间仍然较长&#xff0c;可能的原因包括银行业务办理流程比较复杂、柜员操作技能不够熟练、银行系统的稳定性欠佳、网点某段时间客户比较多等。 2、现场提交材料太多。银行…

事件溯源(Event Sourcing)和命令查询责任分离(CQRS)经验

这篇文章是实现一个基于 CQRS 和事件溯源原则的应用程序&#xff0c;描述这个过程的方式&#xff0c;我相信分享我面临的挑战和问题可能对一些人有用。特别是如果你正在开始自己的旅程。 业务背景 项目的背景与空中交通管理&#xff08;ATM&#xff09;领域相关。我们为一个 …