数据结构01:链表

数据结构

链表

链表和数组的区别

1. 存储方式

  • 数组
    • 元素在内存中连续存储,占用一块连续的内存空间
    • 元素的地址可以通过索引计算(基地址 + 索引 × 元素大小)
    • 大小固定,在创建时需要指定容量
  • 链表
    • 元素(节点)在内存中分散存储,不要求连续
    • 每个节点包含数据和指向下一个(或上一个)节点的指针
    • 大小动态变化,可根据需要随时增减节点

2. 访问效率

  • 数组
    • 支持随机访问,通过索引可以直接访问任意元素,时间复杂度为 O (1)
    • 访问效率高,适合需要频繁随机访问的场景
  • 链表
    • 不支持随机访问,必须从表头(或表尾)开始依次遍历,时间复杂度为 O (n)
    • 访问效率低,不适合需要频繁随机访问的场景

3. 插入和删除操作

  • 数组
    • 插入 / 删除元素时,需要移动该位置后的所有元素,时间复杂度为 O (n)
    • 尤其在数组头部操作时效率极低
    • 动态扩容时需要重新分配内存并复制元素
  • 链表
    • 插入 / 删除元素时,只需修改相关节点的指针,时间复杂度为 O (1)(已知前驱节点时)
    • 不需要移动其他元素,操作效率高
    • 没有扩容问题,内存利用率更高

4. 内存占用

  • 数组
    • 可能存在内存浪费(预分配的容量可能大于实际需要)
    • 内存利用率较低
  • 链表
    • 每个节点需要额外存储指针信息,有一定内存开销
    • 但整体内存利用率更高,不会浪费空间

5. 适用场景

  • 数组
    • 适合需要频繁随机访问元素的场景(如查找操作多)
    • 元素数量固定或变化不大的情况
    • 例如:数据库索引、矩阵存储、缓存实现等
  • 链表
    • 适合需要频繁插入和删除元素的场景
    • 元素数量动态变化较大的情况
    • 例如:链表式队列 / 栈、哈希表链地址法冲突解决、邻接表等

总结对比表

特性数组链表
存储方式连续内存分散内存 + 指针
随机访问支持 (O (1))不支持 (O (n))
插入删除低效 (O (n))高效 (O (1))
内存效率可能浪费空间有指针开销但利用率高
大小固定动态
  • 数组中的数据我们称之为元素

  • 链表中的数据我们称之为节点

    每一个节点都是一个结构体,当前结构体包含两种信息

    1. 数据(每个节点中所存储的信息)
    2. 节点指针(保存下一个节点的信息)
    将节点插入链表:头插法/尾插法/中间插入

    eg:

                                                节点对应结构体
typedef struct Node 
{int num;		   /每个节点中存储的数据,可以有多个struct Node* pNext;   /用于保存下一个节点(结构体)的指针
} Node;函数功能:      创建一个节点int n --------当前节点的数据NODE*  head---------当前链表首节点地址返回类型:成功返回当前节点首地址,失败返回NULLNODE* createNode(int n,NODE* head)
{//创建一个新节点NODE* pNew = (NODE*)malloc(sizeof(NODE));if(pNew == NULL){printf("createNode %d fail:%s!\n",n,strerror(errno));return NULL;}//初始化新节点中的成员变量pNew -> num = n;pNew -> pNext = NULL;//返回当前节点的首地址return pNew;}函数功能:      删除整个链表NODE*  head---------当前链表首节点地址void distroyList(NODE* head){if(head == NULL){return;}NODE* P = head;while(p != NULL){head = p -> pNext;free(p);p = head;}}函数功能:    输出整个链表NODE*  head---------当前链表首节点地址返回类型:成功返回当前节点首地址,失败返回NULLvoid displayList(NODE* head){while(p != NULL){printf("%d",p->num);p = p->pNext;}}                                  void insert_head1(int n,NODE** head)
{//创建新节点NODE*  pNew = createNode(n);//如果是空链表if(*head == NULL){*head = pNew;return}//新节点指向原链表的首节点pNew -> pNext = *head;//将新节点的起始地址给*head*head = pNew;}NODE*	 insert_head2(int n,NODE* head)
{NODE*  pNew = createNode(n);//如果是空链表if(head == NULL){return pNew;}pNew -> pNext = *head;//将新节点的起始地址给*headreturn  pNew;}//插入到结尾NODE* insert_tail(int n, NODE* head)
{//创建节点NODE* pNew == createNode(n);if(pNew == NULL){return pNew;}//获取原链表尾节点的指针NODE* pTail = getTaiilNode(head);if(pTail) = getTaiilNode(head);{return pNew;}pTail ->P=pNext = pNew;return head;}NODE* insertNode(int n,NODE* head,int pos)
{}int main()
{// 用于记录当前链表中首节点的地址NODE* pHead = NULL;// 将节点插入链表中:头插法//insert_head1(5, &pHead);//insert_head1(4, &pHead);//insert_head1(3, &pHead);//insert_head1(2, &pHead);//insert_head1(1, &pHead);//pHead = insert_head2(-5, pHead);//pHead = insert_head2(-4, pHead);//pHead = insert_head2(-3, pHead);//pHead = insert_head2(-2, pHead);//pHead = insert_head2(-1, pHead);// 将节点插入链表中:尾插法//pHead = insert_tail(1, pHead);//pHead = insert_tail(2, pHead);//pHead = insert_tail(3, pHead);//pHead = insert_tail(4, pHead);// 将节点插入链表中:任意位置插入// 假设位置 0 代表头插pHead = insertNode(1, pHead, 3);displayList(pHead);distroyList(pHead);return 0;
}

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

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

相关文章

【Java学习|黑马笔记|Day21】IO流|缓冲流,转换流,序列化流,反序列化流,打印流,解压缩流,常用工具包相关用法及练习

标题【Java学习|黑马笔记|Day20】 今天看的是黑马程序员的《Java从入门到起飞》下部的95-118节,笔记包含IO流中的字节、字符缓冲流,转换流,序列化流反序列化流,打印流,解压缩流,常用工具包相关用法及练习 …

API网关原理与使用场景详解

一、API网关核心原理 1. 架构定位 #mermaid-svg-hpDCWfqoiLcVvTzq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hpDCWfqoiLcVvTzq .error-icon{fill:#552222;}#mermaid-svg-hpDCWfqoiLcVvTzq .error-text{fill:#5…

OSPF路由协议——上

OSPF路由协议 RIP的不足 以跳数评估的路由并非最优路径如果RTA选择s0/0传输,传输需时会大大缩短为3s 最大跳数为16跳,导致网络尺度小RIP协议限制网络直径不能超过16跳,并且16跳为不可达。 收敛速度慢 RIP 定期路由更新 更新计时器&#xff1a…

(LeetCode 面试经典 150 题) 219. 存在重复元素 II (哈希表)

题目&#xff1a;219. 存在重复元素 II 思路&#xff1a;哈希表&#xff0c;时间复杂度0(n)。 哈希表记录每个数最新的下标&#xff0c;遇到符合要求的返回true即可。 C版本&#xff1a; class Solution { public:bool containsNearbyDuplicate(vector<int>& nums,…

Cookies 详解及其与 Session 的协同工作

Cookies 详解及其与 Session 的协同工作 一、Cookies 的本质与作用 1. 什么是 Cookies&#xff1f; Cookies 是由服务器发送到用户浏览器并存储在本地的小型文本文件。核心特性&#xff1a; 存储位置&#xff1a;客户端浏览器数据形式&#xff1a;键值对字符串&#xff08;最大…

DeepSeek Janus Pro本地部署与调用

step1、Janus模型下载与项目部署 创建文件夹autodl-tmp https://github.com/deepseek-ai/Janus?tabreadme-ov-file# janusflow 查看是否安装了git&#xff0c;没有安装的话安装一下&#xff0c;或者是直接github上下载&#xff0c;上传到服务器&#xff0c;然后解压 git --v…

【Elasticsearch】BM25的discount_overlaps参数

discount_overlaps 是 Elasticsearch/Lucene 相似度模型&#xff08;Similarity&#xff09;里的一个布尔参数&#xff0c;用来决定&#xff1a;> 在计算文档长度归一化因子&#xff08;norm&#xff09;时&#xff0c;是否忽略“重叠 token”&#xff08;即位置增量 positi…

Linux | LVS--Linux虚拟服务器知识点(上)

一. 集群与分布式1.1 系统性能扩展方式当系统面临性能瓶颈时&#xff0c;通常有以下两种主流扩展思路&#xff1a;Scale Up&#xff08;向上扩展&#xff09;&#xff1a;通过增强单台服务器的硬件配置来提升性能&#xff0c;这种方式简单直接&#xff0c;但受限于硬件物理极限…

【Linux-云原生-笔记】keepalived相关

一、概念Keepalived 是一个用 C 语言编写的、轻量级的高可用性和负载均衡解决方案软件。 它的主要目标是在基于 Linux 的系统上提供简单而强大的故障转移功能&#xff0c;并可以结合 Linux Virtual Server 提供负载均衡。1、Keepalived 主要提供两大功能&#xff1a;高可用性&a…

计算机网络:概述层---计算机网络的组成和功能

&#x1f310; 计算机网络基础全景梳理&#xff1a;组成、功能与核心机制 &#x1f4c5; 更新时间&#xff1a;2025年7月21日 &#x1f3f7;️ 标签&#xff1a;计算机网络 | 网络组成 | 分布式 | 负载均衡 | 资源共享 | 网络可靠性 | 计网基础 文章目录前言一、组成1.从组成部…

Linux中scp命令传输文件到服务器报错

上传本地文件到Linux服务器使用scp命令报错解决办法使用scp命令报错 Could not resolve hostname e: Name or service not known 解决办法 不使用登录服务器的工具传输&#xff0c;打开本地cmd&#xff0c;使用scp命令传输即可。 scp E:\dcm-admin.jar root127.0.0.1:/

历史数据分析——国药现代

医药板块走势分析: 从月线级别来看 2008年11月到2021年2月,月线上走出了两个震荡中枢的月线级别2085-20349的上涨段; 2021年2月到2024年9月,月线上走出了20349-6702的下跌段; 目前月线级别放巨量,总体还在震荡区间内,后续还有震荡和上涨的概率。 从周线级别来看 从…

#Linux内存管理# 在一个播放系统中同时打开几十个不同的高清视频文件,发现播放有些卡顿,打开视频文件是用mmap函数,请简单分析原因。

在播放系统中同时使用mmap打开几十个高清视频文件出现卡顿&#xff0c;主要原因如下&#xff1a;1. 内存映射&#xff08;mmap&#xff09;的缺页中断开销按需加载机制&#xff1a;mmap将文件映射到虚拟地址空间&#xff0c;但实际数据加载由“缺页中断&#xff08;Page Fault&…

AI黑科技:GAN如何生成逼真人脸

GAN的概念 GAN(Generative Adversarial Network,生成对抗网络)是一种深度学习模型,由生成器(Generator)和判别器(Discriminator)两部分组成。生成器负责生成 synthetic data(如假图像、文本等),判别器则试图区分生成数据和真实数据。两者通过对抗训练不断优化,最终…

FireFox一些设置

firefox后台打开新的链接&#xff0c;例如中键打开一个链接 地址栏输入about:config 找到下面三项&#xff0c;全部设为true browser.tabs.loadInBackground browser.tabs.loadDivertedInBackground browser.tabs.loadBookmarksInBackground 参考&#xff1a;FireFox/chrome…

【黑马SpringCloud微服务开发与实战】(六)分布式事务

1. 什么是分布式事务下单失败&#xff0c;购物车还被清理了。不符合一致性。2. seata的架构和原理3. 部署TC服务docker network ls docker inspect mysql mysql 在hm-net下&#xff0c;这里我的ncaos不是跟着视频配的&#xff0c;因此需要。 docker network connect hm-net nac…

【力扣】第15题:三数之和

原文链接&#xff1a;15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 思路解析 双指针&#xff1a; &#xff08;1&#xff09;头尾指针对应值相加如果大于目标值(target)&#xff0c;那么只能尾指针-1&#xff1b;如果小于target&#xff0c;那么只能头指针1。 &#x…

Linux PCI总线子系统

The Linux Kernel Archives Linux PCI总线子系统 — The Linux Kernel documentation

LeetCode热题100--24. 两两交换链表中的节点--中等

1. 题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4] 输出&#x…

京东视觉算法面试30问全景精解

京东视觉算法面试30问全景精解 ——零售智能 供应链创新 工业落地:京东视觉算法面试核心考点全览 前言 京东作为中国领先的零售科技企业,在智能物流、供应链管理、智能仓储、商品识别、工业质检等领域持续推动视觉AI的创新与大规模落地。京东视觉算法岗位面试不仅关注候…