十天学完基础数据结构-第四天(链表(Linked List))

在这里插入图片描述

链表的基本概念

链表是一种线性数据结构,与数组不同,链表的元素(节点)之间通过指针相互连接。链表有以下基本概念:

  • 节点:链表中的每个数据项称为节点,每个节点包含数据和一个指向下一个节点的指针。

  • 头节点:链表的第一个节点称为头节点,它通常用来表示整个链表的起始位置。

  • 尾节点:链表的最后一个节点称为尾节点,它的指针通常指向空值(null)。

单链表和双链表的区别

链表可以分为单链表双链表两种主要类型。

  • 单链表:每个节点只包含指向下一个节点的指针。单链表具有较小的内存开销,但不能轻松地反向遍历。

  • 双链表:每个节点包含指向下一个节点和上一个节点的指针。双链表允许双向遍历,但内存开销较大。

链表的常见操作

链表支持以下常见操作:

  1. 插入节点:在链表中插入一个新节点,通常需要更新相邻节点的指针。

  2. 删除节点:从链表中删除一个节点,通常需要更新相邻节点的指针。

  3. 反转链表:将链表中的节点顺序颠倒。

  4. 获取链表长度:获取链表中节点的数量。

下面是一个简单的C++示例,创建一个单链表,插入和删除节点,以及获取链表长度:

#include <iostream>// 链表节点定义
struct Node {int data;     // 节点数据Node* next;   // 指向下一个节点的指针
};int main() {// 创建链表头节点Node* head = nullptr;// 插入节点Node* newNode1 = new Node;newNode1->data = 1;newNode1->next = nullptr;head = newNode1;Node* newNode2 = new Node;newNode2->data = 2;newNode2->next = nullptr;newNode1->next = newNode2;// 删除节点delete newNode1;head = newNode2;// 获取链表长度int length = 0;Node* current = head;while (current != nullptr) {length++;current = current->next;}std::cout << "链表长度:" << length << std::endl;return 0;
}

练习题:

  1. 单链表和双链表有什么主要区别?在什么情况下你会选择使用单链表或双链表?
  2. 描述一种情况,其中链表比数组更适合存储和管理数据。
  3. 如何在链表中插入一个新节点?这个操作的时间复杂度是多少?
  4. 如何删除链表中的一个节点?这个操作的时间复杂度是多少?

单链表和双链表有什么主要区别?在什么情况下你会选择使用单链表或双链表?

  • 单链表:单链表中的每个节点只包含一个指针,通常是指向下一个节点的指针。这种结构内存开销较小,但只能单向遍历。单链表适合在内存开销有限的情况下,需要单向访问数据的场景。

  • 双链表:双链表中的每个节点包含两个指针,一个指向下一个节点,另一个指向前一个节点。这允许双向遍历,但内存开销较大。双链表适用于需要双向遍历或频繁在链表中间插入和删除节点的情况。

选择使用单链表或双链表取决于需求。如果只需要单向访问或内存受限,单链表可能更合适。如果需要双向遍历或频繁插入和删除节点,双链表可能更合适。

描述一种情况,其中链表比数组更适合存储和管理数据。

链表比数组更适合以下情况:

  • 动态大小:当数据集的大小在运行时不断变化时,链表更适合,因为它可以动态分配和释放内存,而数组的大小通常是固定的。

  • 频繁插入和删除:如果需要频繁插入和删除数据项,链表比数组更高效,因为插入和删除操作的时间复杂度为O(1),而数组中的相同操作通常需要O(n)。

  • 没有随机访问需求:如果只需要按顺序访问数据而不需要随机访问(使用索引),链表是一个不错的选择。

如何在链表中插入一个新节点?这个操作的时间复杂度是多少?

插入新节点的步骤如下:

  • 创建一个新节点,设置其数据和指针。
  • 更新新节点的指针,使其指向原链表中适当位置的节点。
  • 更新原链表中相邻节点的指针,使其指向新节点。

这个操作的时间复杂度取决于插入位置。如果插入位置是已知的,时间复杂度是O(1),因为只需修改指针。如果需要在链表中间插入,并且需要遍历找到插入位置,时间复杂度是O(n),其中n是链表的长度。

如何删除链表中的一个节点?这个操作的时间复杂度是多少?

删除链表中的节点的步骤如下:

  • 找到要删除的节点。
  • 更新相邻节点的指针,将其跳过要删除的节点。
  • 释放要删除的节点的内存。

这个操作的时间复杂度取决于查找要删除的节点的时间。如果删除位置是已知的,时间复杂度是O(1),因为只需修改指针。如果需要遍历链表来查找要删除的节点,时间复杂度是O(n),其中n是链表的长度。

注意,在删除节点之前,始终要确保释放节点的内存,以避免内存泄漏。

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

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

相关文章

2023年中国智能电视柜产量、需求量、市场规模及行业价格走势[图]

电视柜是随着电视机的发展和普及而演变出的家具种类&#xff0c;其主要作用是承载电视机&#xff0c;又称视听柜&#xff0c;随着生活水平的提高&#xff0c;与电视机相配套的电器设备也成为电视柜的收纳对象。 随着智能家具的发展&#xff0c;智能电视机柜的造型和风格都是有了…

GhostNet原理解析及pytorch实现

论文&#xff1a;https://arxiv.org/abs/1911.11907 源码&#xff1a;https://github.com/huawei-noah/ghostnet 简要论述GhostNet的核心内容。 Ghost Net 1、Introduction 在训练良好的深度神经网络的特征图中&#xff0c;丰富甚至冗余的信息通常保证了对输入数据的全面理…

4.Tensors For Beginners-Vector Definition

在上一节&#xff0c;已经了解了前向和后向转换。 什么是向量&#xff1f; 定义1&#xff1a;向量是一个数字列表 这很简洁&#xff0c;也通俗易懂。 现有两个向量&#xff1a; 如果要把这两个向量给加起来&#xff0c;只需把对应位置的元素(组件)给加起来。 而要缩放向量&…

微服务技术栈-初识Docker

文章目录 前言一、Docker概念二、安装Docker三、Docker服务命令四、Docker镜像和容器Docker镜像相关命令Docker容器相关命令 总结 前言 docker技术风靡全球&#xff0c;它的功能就是将linux容器中的应用代码打包,可以轻松的在服务器之间进行迁移。docker运行程序的过程就是去仓…

视频增强修复工具Topaz Video AI mac中文版安装教程

Topaz Video AI mac是一款使用人工智能技术对视频进行增强和修复的软件。它可以自动降噪、去除锐化、减少压缩失真、提高清晰度等等。Topaz Video AI可以处理各种类型的视频&#xff0c;包括低分辨率视频、老旧影片、手机录制的视频等等。 使用Topaz Video AI非常简单&#xff…

Java开源工具库使用之Lombok

文章目录 前言一、常用注解1.1 AllArgsConstructor/NoArgsConstructor/RequiredArgsConstructor1.2 Builder1.3 Data1.4 EqualsAndHashCode1.5 Getter/Setter1.6 Slf4j/Log4j/Log4j2/Log1.7 ToString 二、踩坑2.1 Getter/Setter 方法名不一样2.2 Builder 不会生成无参构造方法2…

混合优化算法(optimtool.hybrid)

import optimtool as oo from optimtool.base import np, sp, pltpip install optimtool>2.5.0混合优化算法&#xff08;optimtool.hybrid&#xff09; import optimtool.hybrid as oh oh.[方法名].[函数名]([目标函数], [参数表], [初始迭代点], [正则化参数], [邻近算子名…

无约束优化方法(optimtool.unconstrain)

import optimtool as oo from optimtool.base import np, sp, pltpip install optimtool >2.4.2无约束优化方法&#xff08;optimtool.unconstrain&#xff09; import optimtool.unconstrain as ou ou.[方法名].[函数名]([目标函数], [参数表], [初始迭代点])f ( x ) ∑ …

数据结构和算法——数据结构

数据结构&#xff1a; 线性结构&#xff1a; 顺序存储方式&#xff0c;顺序表 常见的顺序存储结构有&#xff1a;数组、队列、链表、栈 链式存储方式&#xff0c;链表 队列&#xff1a; 队列可以使用数组结构或者链表结构来存储&#xff0c;先入先出&#xff0c;后进后出。…

如何使用大语言模型来绘制图画

请创作一张科技感十足的图片&#xff0c;包含siri和iphone两个元素&#xff0c;请帮我挑选合适的style和background 好的&#xff0c;我会为你创作一张科技感十足的图片&#xff0c;包含siri和iphone两个元素。我会根据你的要求&#xff0c;选择一种适合的风格和背景。请稍等一…

智能AI创作系统ChatGPT商业运营版源码+AI绘画系统/支持GPT联网提问/支持Midjourney绘画+Prompt应用+支持国内AI提问模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&…

(五)激光线扫描-位移台标定

线激光属于主动测量方式,但是由于线激光的特性,我们只能通过提取激光中心线获取这一条线上的高度信息,那么要进行三维重建的话,就需要通过平移或者是旋转的方式,来让线激光扫描被测物体的完整轮廓,也就是整个表面。激光线的密度越高还原出来的物体越细腻,但由于数据量大…

RabbitMQ-发布订阅模式和路由模式

接上文 RabbitMQ-工作队列 1 发布订阅模式 将之前的配置类内容都替换掉 Bean("fanoutExchange")public Exchange exchange(){//注意这里是fanoutExchangereturn ExchangeBuilder.fanoutExchange("amq.fanout").build();}Bean("yydsQueue1")publ…

Mac 挂载 Alist网盘

挂载服务器的Alist 网盘到 Mac mac,使用的是 CloundMounter 这个软件进行挂载 http://ip:port/dav/ 需要在末尾加上 /dav/ 在一些服务器上&#xff0c;为了提供WebDAV服务&#xff0c;需要在URL地址的末尾添加"/dav/“。这是因为WebDAV协议规定了一些标准的URL路径&#x…

代码随想录算法训练营第23期day10 |232.用栈实现队列、225. 用队列实现栈

目录 一、&#xff08;leetcode 232&#xff09;用栈实现队列 二、&#xff08;leetcode 225&#xff09;用队列实现栈 两个队列 一个队列 一、&#xff08;leetcode 232&#xff09;用栈实现队列 状态&#xff1a;已AC。pop()、peek()实现逻辑一样&#xff0c;就是peek()要…

Mysql内置函数、复合查询和内外连笔记

目录 一、mysql内置函数 1.1.日期函数 1.2.字符串函数 1.3.数学函数 1.4.其他函数 二、复合查询 2.2 自连接 2.3 子查询 2.3.1单行自查询 2.3.2 多行子查询 2.3.3 多列子查询 2.3.4在from子句中使用子查询 2.3.5合并查询 三、表的内连和外连 3.1内连接 3.2外连接…

竞赛选题 深度学习 opencv python 实现中国交通标志识别

文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 &#x1f525; 优质…

1024 科学计数法

一.问题&#xff1a; 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法&#xff0c;其满足正则表达式 [-][1-9].[0-9]E[-][0-9]&#xff0c;即数字的整数部分只有 1 位&#xff0c;小数部分至少有 1 位&#xff0c;该数字及其指数部分的正负号即使对正数也必定明确…

5分钟入门卷积算法

大家好啊&#xff0c;我是董董灿。 深度学习算法中&#xff0c;尤其是计算机视觉&#xff0c;卷积是无论如何都绕不过去的槛。 初学者看到这个算法后&#xff0c;很多是知其然不知其所以然&#xff0c;甚至不知道这个算法是做什么的&#xff0c;或者很疑惑&#xff0c;为什么…

数据结构-优先级队列(堆)

文章目录 目录 文章目录 前言 一 . 堆 二 . 堆的创建(以大根堆为例) 堆的向下调整(重难点) 堆的创建 堆的删除 向上调整 堆的插入 三 . 优先级队列 总结 前言 大家好,今天给大家讲解一下堆这个数据结构和它的实现 - 优先级队列 一 . 堆 堆&#xff08;Heap&#xff0…