【链表】关于链表,你该了解这些!

news2024/11/27 0:31:32

【链表】理论基础

  • 1 链表是什么
    • 1.1 单链表
    • 1.2 双链表
    • 1.3 循环链表
  • 2 链表的存储方式
  • 3 链表的定义
    • 3.1 C/C++方式
    • 3.2 Java方式
    • 3.3 JavaScript方式
  • 4 链表的操作
    • 4.1 删除结点
    • 4.2 添加结点


1 链表是什么


1.1 单链表

单链表一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)

链表的入口节点称为链表的头结点也就是head。
在这里插入图片描述


1.2 双链表

单链表中的指针域只能指向节点的下一个节点。

双链表每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。

双链表 既可以向前查询也可以向后查询

如图所示:
在这里插入图片描述


1.3 循环链表

循环链表,顾名思义,就是链表首尾相连。

循环链表可以用来解决约瑟夫环问题。
在这里插入图片描述


2 链表的存储方式

数组是在内存中是连续分布的,但是链表在内存中可不是连续分布的。

链表通过指针域的指针链接在内存中各个节点

所以链表中的节点在内存中不是连续分布的 ,而是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理

如图所示:
在这里插入图片描述
这个链表起始节点为2, 终止节点为7, 各个节点分布在内存的不同地址空间上,通过指针串联在一起。


3 链表的定义

在面试的时候,会有可能要求手写链表,所以很有必要掌握链表的定义方式。


3.1 C/C++方式

// 单链表
struct ListNode {
    int val;  // 节点上存储的元素
    ListNode *next;  // 指向下一个节点的指针
    ListNode(int x) : val(x), next(NULL) {}  // 节点的构造函数
};

不定义构造函数行不行,答案是可以的,C++默认生成一个构造函数。

但是这个构造函数不会初始化任何成员变量。

如果想在初始化的时候给链表节点赋值,则需要自定义构造函数。

如下:
通过自己定义构造函数初始化节点:

ListNode* head = new ListNode(5);

这里的链表节点中的val就被赋为5。

如果不自定义构造函数,则需要通过以下的方式:

ListNode* head = new ListNode();
head->val = 5;

3.2 Java方式

public class ListNode {
    // 结点的值
    int val;

    // 下一个结点
    ListNode next;

    // 节点的构造函数(无参)
    public ListNode() {
    }

    // 节点的构造函数(有一个参数)
    public ListNode(int val) {
        this.val = val;
    }

    // 节点的构造函数(有两个参数)
    public ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}

3.3 JavaScript方式

class ListNode {
  val;
  next = null;
  constructor(value) {
    this.val = value;
    this.next = null;
  }
}

4 链表的操作

4.1 删除结点

删除D节点,如图所示:
在这里插入图片描述
只要将C节点的next指针 指向E节点就可以了。

那有同学说了,D节点不是依然存留在内存里么?只不过是没有在这个链表里而已。

是这样的,所以在C/C++里最好是再手动释放这个D节点,释放这块内存。

C: free ( p );
C++: delete p;

其他语言例如Java、Python,就有自己的内存回收机制,就不用自己手动释放了。


4.2 添加结点

如图所示:
在这里插入图片描述
可以看出链表的增添和删除都是O(1)操作,也不会影响到其他节点。

但是要注意,要是删除第五个节点,需要从头节点查找到第四个节点通过next指针进行删除操作,查找的时间复杂度是O(n)。


内容整理于Carl老师的《代码随想录》,强推!

By – Suki 2023/1/5

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

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

相关文章

谷粒学苑项目-第一章数据库设计与项目结构

一、数据库设计 1、数据库 guli2、数据表 CREATE TABLE edu_teacher (id char(19) NOT NULL COMMENT 讲师ID,name varchar(20) NOT NULL COMMENT 讲师姓名,intro varchar(500) NOT NULL DEFAULT COMMENT 讲师简介,career varchar(500) DEFAULT NULL COMMENT 讲师资历,一句话说…

6个实用的红米手机技巧

❤️作者主页:IT技术分享社区 ❤️作者简介:大家好,我是IT技术分享社区的博主,从事C#、Java开发九年,对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉: 数据库领域优质创作者🏆&#x…

盐湖提锂纳滤膜后钙镁离子深度处理技术

盐湖提锂:大规模、低成本,全球锂资源供应主体的理想来源锂作为自然界中轻、标准电极电势低、电化学当量大的金属元素,是天生理想的“电池金属”,因此在要求高比能的动力和储能应用场景中将具备长期的需求刚性,被誉为“…

Skywalking简单入门使用

🏆今日学习目标: 🍀Skywalking简单入门使用 ✅创作者:林在闪闪发光 ⏰预计时间:50分钟 🎉个人主页:林在闪闪发光的个人主页 🍁林在闪闪发光的个人社区,欢迎你的加入: 林…

软件测试/测试开发丨 | 想做App测试就一定要了解的App结构

性能测试 所谓的性能测试要在功能测试之后。 功能测试:关注能不能用 性能测试:关注好不好用 常见的性能关注点有: 接口响应时间:50毫秒 ~ 1000毫秒 吞吐量:1000万每天,2000万每天 ......10亿每天 TPS&a…

java面试题基本部分

一、Java 基础 1.Java常见基本类型如下 整数类(byte、short、int、long) 浮点类(float、double) 字符类(char) 布尔型(boolean)大小: boolean(8位 1字节) byte(8位 1字…

【数据结构与算法】Manacher算法

Manacher算法 https://github.com/SongJianHIT/DataStructurs-Algorithm/tree/main/src/algorithms/manacher 基本介绍 Manacher 算法常用于 求一个字符串中的最长回文子串。如:abc123321def 的最长回文子串为 123321。 计算字符串的最长回文字串最简单的算法就是…

Lattice CrossLink-Nx LIFCL-40应用连载8:MIPI DSI接口驱动LCD显示器

作者:Hello,Panda 一、案例需求 使用LIFCL-40-7MG121I FPGA的MIPI DSI硬核接口驱动7寸LCD显示器: (1)显示器:7寸,1024*600横屏,60Hz; (2)MIPI物…

计算机网络实验---Cisco Packet Tracer 实验

直接连接两台 PC 构建 LAN 用交换机构建 LAN 交换机接口地址列表 生成树协议(Spanning Tree Protocol) 路由器配置初步 静态路由 动态路由 RIP 动态路由 OSPF 基于端口的网络地址翻译 PAT 虚拟局域网 VLAN 虚拟局域网管理 VTP VLAN 间的通信 …

功率放大器电路图集(多种类功率放大电路)

关于功率放大器电路图集的问题是很多工程师都感兴趣和想了解的,今天就请安泰电子来为大家介绍一下多种类功率放大电路的内容。 一、功率放大电路介绍 1、一般情况来说功率放大电路的主要作用是让负载在不使信号失真或轻微失真的情况下获得最大功率。因此&#xff0c…

JavaScript 语法

文章目录JavaScript 语法JavaScript 语法JavaScript 字面量JavaScript 变量JavaScript 操作符JavaScript 语句JavaScript 关键字JavaScript 注释JavaScript 数据类型数据类型的概念JavaScript 函数JavaScript 字母大小写JavaScript 字符集JavaScript 语法 JavaScript 是一个程序…

Docker - Docker Compose;Docker Swarm

一、Docker Compose (一)Docker Compose介绍 Docker Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用YML文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从YML文件配置中创…

可视化组件使用小技巧——中国地图组件的应用

中国地图作为我们数据展示常用的组件,通常被我们用来展示与地理位置相关的数据,中国地图组件在实际应用中可以帮助我们充当地区数据展示的作用,并让我们一眼看出区域之前的差异趋势。接下来结合实际案例让我们看看在山海鲸可视化软件中如何具…

你知道几种乘法的计算方式?

前言 家里有本《算法详解》一直没有看,昨天晚上打开翻了翻,觉得写的挺有趣的,第一章讨论了一个大家都学过的内容,乘法的计算。大部分人计算乘法,应该都只有一种方式,乘法的计算,也算是一种算法…

记录--微信小程序跳转H5、小程序、App

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 在业务中接触了微信小程序,客户对引流用户非常在意,每次都会提该需求,经常做就存档一下。使用的小程序账户都是企业版非个人版本。 跳转H5 在微信公众平台-小程序后…

axios:基本使用、常用配置项、create方法、请求和响应拦截器、取消请求

axios的使用一、发送ajax请求1.axios函数发送通用请求2.精简版GET请求3.精简版POST请求二、配置通用属性(create方法)三、请求和响应拦截器1.请求拦截器2.响应拦截器四、取消请求五、axios源码解析官网:https://github.com/axios/axios 一、…

GitHub桌面版和汉化包,使用详细(GitHub Desktop安装,github软件汉化包详细使用过程)

github大家都比较熟悉,而它的桌面版使用则更加方便(GitHub桌面版就是GitHub Desktop,它们的数据都是相通的),但是软件是英文版本,使用起来不太方便,这里为大家提供了该软件和汉化包,…

记一次靶场实战【网络安全】

前言 【一一帮助安全学习一一】 ①网络安全学习路线 ②20份渗透测试电子书 ③安全攻防357页笔记 ④50份安全攻防面试指南 ⑤安全红队渗透工具包 ⑥网络安全必备书籍 ⑦100个漏洞实战案例 ⑧安全大厂内部视频资源 ⑨历年CTF夺旗赛题解析 一、信息收集 先用nmap扫一下ip。 锁定…

多元线性回归分析

回归分析:研究X和Y之间相关性的分析回归分析是数据分析中最基础也是最重要的分析工具,绝大多数的数据分析问题,都可以使用回归的思想来解决。回归分析的任务就是,通过研究自变量X和因变量Y的相关关系,尝试去解释Y的形成…

gumbel-softmax的使用、课程学习的使用、有监督的对比学习的使用、无监督的对比学习的使用

一、gumbel-softmax的使用 gumbel-softmax里面的 τ\tauτ值越接近无穷获得的向量越接近一个均匀分布的向量;τ\tauτ值越接近0获得的向量越接近一个one-hard vector;τ\tauτ值越接近1则gumbel-softmax就和softmax越类似 # score:代表序列…