链表理论:基础概念与实战技巧!

推荐阅读

算法day01_ 27. 移除元素、977.有序数组的平方
算法day02_209.长度最小的子数组
算法day03_ 59.螺旋矩阵II

目录

    • 推荐阅读
      • 链表理论知识
      • 单向链表(单链表)
        • 定义单链表
        • 单链表添加下一个节点
        • 单链表中插入一个节点
        • 单链表中删除下一节点
        • 遍历单链表
      • 双向链表(双链表)
        • 定义双链表
        • 双链表增加新节点
        • 双链表插入一节点
        • 双链表删除一节点
      • 循环单链表
        • 定义循环单链表
        • 循环单链表中插入一节点
        • 循环单链表中删除一节点
        • 遍历循环单链表
      • 数组与链表性能比较

链表理论知识

在这里插入图片描述

链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存入下一个节点的地址。

链表的入口节点称为链表的头结点也就是head
20200806194529815.png
链表是通过指针域的指针链接在内存中各个节点,它在内存中不是连续分布的,而是散乱分布在内存中的某个地址上。

20200806194613920.png

单向链表(单链表)

链表中存入当前节点的值(数据域)和指向下一个节点的指针(指针域)

408px-Singly-linked-list.svg_.png

单链表相关操作

定义单链表
// 定义一个单链表
public class Node {

    private int data;//存储数据域
    private Node nextNode;//存储指向下一个的指针

    //编写构造方法
    public Node(){
    
    }
    
    
    public Node(int data){
        this.data=data;
    }

    public Node(int data,Node nextNode){
     this.data=data;
     this.nextNode=nextNode;
     
    }
     // 获取下一个节点的方法
    public Node nextNode() {
        return this.nextNode;
    }

    // 获取节点中的数据
    public int getData() {
        return this.data;
    }
    
}

单链表添加下一个节点
//在单链表中添加、插入一个节点
    public Node append(Node node){
        //获得当前节点
        Node currentNode=this;

        //循环往后找,直到该节点为空
        while (true){
            //获得下一个节点
            Node nextNode=currentNode.nextNode;

            // 如果下一个节点为 Null, 当前节点已经是最后一个节点
            if (nextNode==null){
                break;
            }
            
            //赋值给当前节点
            currentNode=nextNode;
        }
        
        //把添加的节点追加到当前的节点上
        currentNode.nextNode=node;
        return this;
    }
单链表中插入一个节点
    //插入节点
    public void after(Node node){
        //取出下一节点,用作下下节点
        Node newNode=this.nextNode;
        //把插入节点作为下一节点
        this.nextNode=node;
        //把下下节点作为插入节点的下一个节点
        node.nextNode=newNode;
    }

单链表中删除下一节点

删除操作主要就是将当前节点的指针指向下下一个节点。

a1fc55068c4efe8bcea087182f38884d.gif

    //删除下一节点
    public void remove(){
        //取出下下一节点
        Node newNode= this.nextNode.nextNode;
        //把下下一个节点设置为当前节点的下一个节点
        this.nextNode=newNode;
    }

遍历单链表
//遍历链表
    public void showList(){
        //当前链表
        Node currentNode=this;
        
        while (true){
            System.out.println(currentNode.data+",");
            //取出下一节点
            Node nextNode=currentNode.nextNode;
            
            //如果为空,跳出循环
            if (nextNode==null){
                System.out.println();
                break;
            }
        }
    }

双向链表(双链表)

当前节点的值(数据域)(指针域) 一个指向前一个节点的指针,一个指向后一个节点的指针。

610px-Doubly-linked-list.svg_.png

双链表相关操作

定义双链表
public class DoubleNode {
    
    //上一个节点
    private DoubleNode preNode;
    private int data;
    //下一个节点
    private DoubleNode nextNode;
    
    public DoubleNode(int data){
        this.data=data;
    }

    public DoubleNode getPreNode() {
        return preNode;
    }

    public int getData() {
        return data;
    }

    public DoubleNode getNextNode() {
        return nextNode;
    }
}
双链表增加新节点
 //增加节点
    public void add(DoubleNode node){
        //当前节点
        DoubleNode currentNode=this;
        //当前节点的下一个节点
        DoubleNode newNode=this.nextNode;
        //新节点作为当前节点的下一个节点
        this.nextNode=node;
        node.preNode=currentNode;
        // 原来的下一个节点作为新节点的下一个节点
        node.nextNode=newNode;
        // 让原来的下一个节点的上一个节点为当前新节点
        newNode.preNode=node;
        
    }
双链表插入一节点
 //插入一节点
    public void insert(DoubleNode node){

        DoubleNode currentNode=this;
        //取出下一节点,用作下下节点
        DoubleNode newNode=this.nextNode;

        //把插入节点作为下一节点
        currentNode.nextNode=node;
        node.preNode=currentNode;

        //把下下节点作为插入节点的下一个节点
        node.nextNode=newNode;
        newNode.preNode=node;

    }
双链表删除一节点

    //删除一节点
    public void delete(){
        //获取当前节点
        DoubleNode currentNode=this;
        // 取出下下一个节点
        DoubleNode newNode=this.nextNode.nextNode;

        // 把下下一个节点设置为当前节点的下一个节点
        currentNode.nextNode=newNode;
        newNode.preNode=currentNode;
    }

循环单链表

循环链表,链表首尾相连,用于解决约瑟夫环问题。

20200806194629603.png
循环单链表相关操作

定义循环单链表
public class forList {

    private int data;
    private forList nextNode;

    public forList(int data){
        this.data=data;
    }

    public int getData() {
        return data;
    }

    public forList getNextNode() {
        return nextNode;
    }
}

循环单链表中插入一节点
public void insert(forList node){
        forList currentNode=this;
        //取出下一节点,用作下下节点
        forList nextNode=this.nextNode;
        //把插入节点作为下一节点
        currentNode.nextNode=node;
        //把下下节点作为插入节点的下一个节点
        node.nextNode=nextNode;
    }

循环单链表中删除一节点
//删除某一节点
    public void delete(){
        // 取出下下一个节点
        forList newNode=this.nextNode.nextNode;
        // 把下下一个节点设置为当前节点的下一个节点
        this.nextNode=newNode;
    }

遍历循环单链表
//遍历所有节点
    public void showAllNode(){
        forList currentNode=this;
        
        while (true){
            System.out.println("当前节点:"+currentNode.data);
            
            if (currentNode.nextNode==null){
                System.out.println("已经为最后一个节点");
                break;
            }
            
        }
    }

数组与链表性能比较

数组在定义的时候,长度就是固定的,如果想改动数组的长度,就需要重新定义一个新的数组。
链表的长度可以是不固定的,并且可以动态增删, 适合数据量不固定,频繁增删,较少查询的场景。

20200806195200276.png

在这里插入图片描述

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

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

相关文章

《GitHub新手入门指南:从零开始掌握基本用法》

在现代软件开发和技术社区中,GitHub已经成为了一个不可或缺的平台。它不仅是一个代码托管平台,更是一个技术交流、学习分享的社交平台。但对于初学者来说,GitHub可能会有些令人望而却步。本文将详细介绍GitHub的基本用法,帮助新手快速入门并融入这个充满活力的技术社区。 …

Linux 实现打印彩色进度条

文章目录 预备知识一、理解回车换行二、认识行缓冲1、代码一、二(回车换行理解)2、代码三、四(sleep函数和ffush函数理解) 三、简单倒计时1. 倒计时代码2、效果展示 四、进度条1、效果展示2、进度条代码makefileProcessBar.hProce…

从零开始搭建web组态

成果展示:by组态[web组态插件] 一、技术选择 目前只有两种选择,canvas和svg Canvas: 是一个基于像素的渲染引擎,使用JavaScript API在画布上绘制图像,它的优点包括: Canvas渲染速度快,适合处理大量图像和…

【STM32】STM32学习笔记-FLASH闪存(48)

00. 目录 文章目录 00. 目录01. FLASH简介02. 闪存模块组织03. FLASH基本结构04. FLASH解锁05. 使用指针访问存储器06. 程序存储器编程07. 选项字节08. 选项字节编程09. 选项字节擦除10. 器件电子签名11. 附录 01. FLASH简介 STM32F1系列的FLASH包含程序存储器、系统存储器和选…

【.NET Core】.NET中的流(Stream)

【.NET Core】.NET中的流(Stream) 文章目录 【.NET Core】.NET中的流(Stream)一、流(Stream)1.1 FileStream类1.2 IsolatedStorageFileStream类1.3 MemoryStream类1.4 BufferedStream类1.5 NetworkStream类…

STM32 (2)

1.stm32编程模型 将C语言程序烧录到芯片中会存储在单片机的flsah存储器中,给芯片上电后,Flash中的程序会逐条进入到CPU中去执行,进而CPU去控制各种模块(即外设)去实现各种功能。 2.寄存器和寄存器编程 CPU通过控制其…

公司电脑文件防泄密软件——| 中科数安

公司电脑文件防泄密软件是一种专门设计用于保护企业敏感信息和数据安全的软件。这些软件通过采用各种技术手段,如数据加密、访问控制、行为监控等,来防止公司的机密文件、客户资料、财务数据等被非法获取、复制或传播。 www.weaem.com 以下是公司电脑文件…

选项 打光 试题总结

试题1 被测物体100100mm,精度要求被测物体 ,精度要求0.1mm,相机距被测物体在200~320mm之间,要求选择合适的相机和镜头? 分析如下: 通常我们用的相机靶面是4:3 的所以我们要用短边来计算视场&am…

Vue导出json数据到Excel表格

一、安装依赖 npm install file-saver --save npm install xlsx --save npm install script-loader --save-dev二、下载两个所需要的js文件Blob.js和 Export2Excel.js。 这里下载:下载地址 三、src目录下新建vendor文件夹,将Blob.js和 Export2Excel.j…

STM32学习和实践笔记(1): 装好了的keil μVision 5

2019年3月在淘宝上买了这块STM32的开发板,学了一段时间后就丢下了,今天重新捡起来,决定好好学习、天天向上。 对照教程,今天先把keil5装上了。 装的过程有以下几点值得记录下: 1)用注册机时,…

x86中的TSS与任务切换

前言 今天在学习《深入理解Linux内核》的时候,发现出现了一个新的名词TSS(Task-State Segment),这还是我第一次了解到原来x86提供了硬件级别的任务切换功能,之前以为任务切换都是操作系统实现的来着,这里也…

计算机电源的功率不足150W的几种主要原因?

180 至 250 伏 180-250伏 一般计算机电源的工作电压范围为 180 至 250 伏。 电脑电源是安装在电脑内部的电脑部件,负责将普通市电电源转换成电脑可以使用的电压。 电脑电源是一个开关电路,将普通交流电转换为直流电,然后通过斩波控制电压&a…

JavaScript 中的类型转换机制(详细讲解)

文章目录 一、概述二、显示转换Number()parseInt()String()Boolean() 三、隐式转换自动转换为布尔值自动转换成字符串自动转换成数值 一、概述 前面我们讲到,JS中有六种简单数据类型:undefined、null、boolean、string、number、symbol,以及…

你知道为什么输电线路除冰采用的是直流电而不是交流电呢?

2月22日以来,受新一轮寒潮影响,四川地区气温骤降,多地出现了零摄氏度以下的低温和冰冻天气,泥巴山、蓑衣岭等微气象区域20条500千伏线路出现不同程度覆冰,其中500千伏石雅四回线路覆冰最为严重,导线和铁塔上…

程序员在面试过程中需要重点关注的问题

在金三银四这个关键的求职季节,程序员面试的成功与否往往决定了他们能否获得心仪的工作机会。在这篇文章中,我将详细介绍程序员在面试过程中需要重点关注的问题,并提供一些实用的建议和技巧。 一、了解自己和职位要求 在面试之前&…

在线绘图利器:支持在线使用的电脑画图软件推荐!

计算机绘图软件是现代设计师和创作者必不可少的工具之一。伴随着技术的不断发展,越来越多的在线计算机绘图软件应运而生,为用户提供了更加便捷、高效的创作方法。对初学者而言,选择一款易于使用、功能强大的计算机绘图软件至关重要。本文将介…

39. 【Linux教程】修改文件所属关系

上一节介绍了如何修改文件的读、写、执行权限,包括属主用户权限、所属用户组权限、其他用户组用户权限,本小节介绍如何修改文件的所属关系,所属关系又包括文件的属主和所属组。 1.chown 命令 若想要修改文件的属主,可以使用 chow…

便携式启动电源的市场前景和商业机会

便携式启动电源是一种便携式电子设备,主要用于为飞机、火炮、汽车、船只等大型机械提供紧急启动电源。它通常由一个可充电的电池和一个充电器组成,可以方便地随身携带。 便携式启动电源的工作原理是通过将电池的电能转换为机械能,从而驱动汽…

Leetcoder Day38| 动态规划part05 背包问题

1049.最后一块石头的重量II 有一堆石头&#xff0c;每块石头的重量都是正整数。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果如下&#xff1a; 如果 x y&#xff0c;那…

云端技术驾驭DAY15——ClusterIP服务、Ingress服务、Dashboard插件、k8s角色的认证与授权

往期回顾&#xff1a; 云端技术驾驭DAY01——云计算底层技术奥秘、云服务器磁盘技术、虚拟化管理、公有云概述 云端技术驾驭DAY02——华为云管理、云主机管理、跳板机配置、制作私有镜像模板 云端技术驾驭DAY03——云主机网站部署、web集群部署、Elasticsearch安装 云端技术驾驭…