数据结构|浅谈数组与链表

简介: 关于数组与链表

很多编程语言的标准库中都实现了很多数据结构,方便开发者快速上手,避免重复造轮子,例如Java中的XXXList,Go的slice以及container包中的list包。他们大多是基于数组与链表这两个基本数据结构的封装,也是两种不同的数据存储方式,这两种数据结构究竟有何异同?

数组

image.png

在内存中,数组由一段连续的内存组成,且长度固定,如图所示。

查找元素

在C语言中,数组名保存着数组的首地址,如果是一个int型数组,每个元素占4字节,若起始地址base == 200,则第i个元素的起始地址为200 + 4 * i,数组中的任何一个元素的位置都可以这样计算出来,与元素个数无关,时间复杂度为O(1)。

增删元素

从长度为 N 的数组中删除或者插入位于 i 的元素,我们需要移动(N - i)个元素,在这个过程中,定位的时间复杂度为O(1),相当于一次查找,定位后,我们需要执行(N - i)次写入操作,来调整位置,时间复杂度为O(N)。

如果在末尾插入一个元素,并且超出数组的空间大小时,需要重新申请一块更大的内存,所需空间复杂度更高。

链表

image.png

在内存中,链表由多个分散在不同位置的节点组成,每个节点保存其元素与下一个节点的位置,因此链表的大小不是固定的,与元素的个数相应,因为每个节点多出一个保存地址的空间,存储相同数量的元素,其空间复杂度大约是数组的二倍。

查找元素

我们只知道每个链表头节点的位置,所以如果要找到第i个元素,需要执行i次listNode = listNode->next的操作,时间复杂度为O(N),这一点并不如数组来的快。

增删元素

与数组一样,我们依旧需要执行一次时间复杂度为O(N)的定位操作之后,再执行一个操作即可完成链表的增删元素。

例如:

void DelAnyToList(ListNode listNode, int loca)
{
for (int i = 1; i < loca; i++)
{
if (listNode->next == NULL)
{
cout<<"DelAnyToList Error loca more long than List"<next;
}
ListNode
delNode = listNode->next;
listNode->next = listNode->next->next;

delete delNode;    

}

但是,对于末尾插入元素,链表则相对于数组的整体迁移,时间复杂度低很多。不过一般情况下,数组与链表的插入删除操作可以说是各有优势。如果链表与其他数据结构搭配使用,例如哈希表,来存储链表中每个位置的指针。这样,我们可以直接访问要插入删除的元素,而不需要遍历整个链表。相对于数组拥有更大的优势。

总结

本篇文章尚不严谨,没想到会越写越疑惑,关于更详细的研究,感觉得再想想。

在查询比较多的场景中,我们要尽量使用数组,而在添加和删除操作比较多时,我们应该使用链表结构

目录
相关文章
|
2月前
|
存储 算法 Perl
数据结构实验之链表
本实验旨在掌握线性表中元素的前驱、后续概念及链表的建立、插入、删除等算法,并分析时间复杂度,理解链表特点。实验内容包括循环链表应用(约瑟夫回环问题)、删除单链表中重复节点及双向循环链表的设计与实现。通过编程实践,加深对链表数据结构的理解和应用能力。
71 4
|
12天前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
30 5
|
26天前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
87 5
|
2月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
70 4
|
2月前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
137 4
|
2月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
2月前
|
算法
数据结构之购物车系统(链表和栈)
本文介绍了基于链表和栈的购物车系统的设计与实现。该系统通过命令行界面提供商品管理、购物车查看、结算等功能,支持用户便捷地管理购物清单。核心代码定义了商品、购物车商品节点和购物车的数据结构,并实现了添加、删除商品、查看购物车内容及结算等操作。算法分析显示,系统在处理小规模购物车时表现良好,但在大规模购物车操作下可能存在性能瓶颈。
61 0
|
2月前
|
C语言
【数据结构】双向带头循环链表(c语言)(附源码)
本文介绍了双向带头循环链表的概念和实现。双向带头循环链表具有三个关键点:双向、带头和循环。与单链表相比,它的头插、尾插、头删、尾删等操作的时间复杂度均为O(1),提高了运行效率。文章详细讲解了链表的结构定义、方法声明和实现,包括创建新节点、初始化、打印、判断是否为空、插入和删除节点等操作。最后提供了完整的代码示例。
95 0
|
7月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表

热门文章

最新文章