线性结构数据——列表和链表(完)
内容概要
一、列表与数组的区别
二、链表介绍
三、单链表与双链表
四、列表与链表优缺点
1、列表与数组的区别
列表与数组的相同点
列表与数据中的元素都是紧挨着的
空间也是确定的(列表添加或者删除时,其实是重新开了一份空间,将原来的数据加上要添加的数据一起拷贝到那里)
列表与数组的不同点
数组只能存储相同类型的数据
列表可以实现存储不同类型的数据
对于一个整形数组,必须有数组起始内存地址,数据的长度跨度以及数据的解析方式
其实列表存储的每一个元素的长度也是等长的,它存储数据的方式类似于c语言的指针数组
python的列表存储方式
列表存储的每一个地址的长度是等长的。但与c语言还是有些不一样,c语言的指针数组中的指针类型是一致的,也就是说指针指向的数据类型都是一样的;而python列表指向的
数据的类型可以不一样 **python是怎么知道列表地址指向的数据的类型的?**
尝试c语言的void指针列表,看是否能够模拟列表的功能
#include <stdio.h> int main(void){ void *array[10]; int a = 10; float b = 1.2; long c = 24; char str[20] = "hello world"; array[0] = &a; array[1] = &b; array[2] = &c; array[3] = str; // 其实就是尝试解引用一个void指针 // printf("%d\n", *array[0]); printf("%d\n", *(int *)array[0]); // printf("%f\n", *array[1]); printf("%f\n", *(float *)array[1]); // printf("%s\n", *array[3]); printf("%s\n", (char *)array[3]); return 0/ }
2、链表
链表也是种线性数据结构
与列表和数组不同的是,链表存储的数据是分散的,但是分散的数据彼此之间又存在联系,构成一条近似线性的数据结构
这样每个空间被称为节点,每个节点有数据域以及一个指向下一个节点的指针
3、单链表与双链表
-单链表结构示意图(这是用c语言实现的链表数据结构)
利用python实现单链表
class Node: def __init__(self, val): self.val = val # 该节点存放的数据 self.next = None # 指向下一个节点的指针 a = Node(1) b = Node(2) c = Node(3) # 连接每个节点 a.next = b b.next = c print(a.val) print(a.next.val) print(a.next.next.val)
-双链表结构示意图
双链表代码实现
class Node: def __init__(self, val): self.val = val # 该节点存放的数据 self.next = None # 指向下一个节点的指针 self.previous = None
双链表与单链表不同的是
单链表只能依次向下访问元素,而不能够自下而上访问之前的元素
只要知道双链表中的任意一个节点,就能遍历整个双链表
4、列表与链表的优缺点
列表与链表的优缺点
如果使用列表下标查找数据,此次查询操作的时间复杂度为O(1);列表的下标操作实际是通过列表首元素地址+每个地址长度*下标数得到对应元素的内存地址,实现快速查找
如果要找某个元素是否存在,两种方式的时间复杂度都为O(n);
如果在列表末尾或者是在链表中插入节点,那么两种方法的时间复杂度都可以视为O(1)
不同的是
链表在插入和删除时,时间复杂度为O(1);而列表的插入和删除操作的时间复杂度为O(n)
链表在内存允许下,能无限添加;而列表的添加实质是拷贝
***完***
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构