数据结构-链表

像数组一样,链表也用来表示一系列的元素。事实上,能用数组来做的事情,一般也可以用链表来做。然而,链表的实现跟数组是不一样的,在不同场景它们会有不同的性能表现。

计算机的内存就像一大堆格子,每格都可以用来保存比特形式的数据。当要创建数组时,程序会在内存中找出一组连续的空格子,给它们起个名字,以便你的应用存放数据,见下图。

计算机能够直接跳到数组的某一索引上。如果代码要求它读取索引4的值,那么计算机只需一步就可以完成任务。重申一次,之所以能够这样,是因为程序事先知道了数组开头所在的内存地址------例如地址是1000------当它想去索引4时,便会自动跳到1004处。

与数组不同的是,组成链表的格子不是连续的。它们可以分布在内存的各个地方。这种不相邻的格子,就叫作结点。

那么问题来了,计算机怎么知道这些分散的结点里,哪些属于这个链表,哪些属于其他链表呢?

这就是链表的关键了:每个结点除了保存数据,它还保存着链表里的下一结点的内存地址。这份用来指示下一结点的内存地址的额外数据,被称为链。链表如下图所示。

此例中,我们的链表包含4项数据:"a"、"b"、"c"和"d"。因为每个结点都需要2个格子,头一格用作数据存储,后一格用作指向下一结点的链(最后一个结点的链是null,因为它是终点)​,所以整体占用了8个格子。

若想使用链表,你只需知道第一个结点在内存的什么位置。因为每个结点都有指向下一结点的链,所以只要有给定的第一个结点,就可以用结点1的链找到结点2,再用结点2的链找到结点3......如此遍历链表的剩余部分。

链表相对于数组的一个好处就是,它可以将数据分散到内存各处,无须事先寻找连续的空格子。

实现一个链表

我们用Ruby来写一个链表,最终实现包含两个类:Node和LinkedList。先是Node。

Node类有两个属性:data表示结点所保存的数据,next_node表示指向下一结点的链,使用方法如下。

以上代码创建了4个连起来的结点,它们分别保存着"once"、"upon"、"a"和"time" 4项数据。虽然只用Node也可以创建出链表,但我们的程序无法由此轻易地得知哪个结点是链表的开端。因此我们还得创建一个LinkedList类。下面是一个最基本的LinkedList的写法。

有了这个类,我们就可以用以下代码让程序知道链表的起始位置了。

LinkedList的作用就是一个指针,它指向链表的第一个结点。

既然知道了链表是什么,下一篇文章会写它跟数组的性能对比,观察它们在读取、查找、插入和删除上有何优劣。

相关推荐
我命由我1234510 小时前
方差(实例实操、与标准差的区别)
java·数据结构·算法·数据分析·java-ee·intellij-idea·idea
努力努力再努力wz10 小时前
【高性能网络库与HTTP Server系列】:基于主从 Reactor 模型实现高性能 C++ 网络库与 HTTP Server
开发语言·网络·数据结构·数据库·c++·网络协议·http
什巳11 小时前
JAVA练习275-乘积最大子数组
java·开发语言·数据结构·算法
码完就睡12 小时前
数据结构——串的模式匹配算法(BF算法、KMP算法)
数据结构·算法
tachibana212 小时前
hot100 排序链表(148)
java·数据结构·算法·leetcode·链表
Tim_1012 小时前
【C++】015、函数参数:值传递,指针传递,引用传递的区别
数据结构·c++·算法
Yang_jie_0314 小时前
笔记:数据结构(链表)
数据结构·笔记·链表
aqiu11111114 小时前
【算法日记16】LeetCode 283. 移动零:O(N) 双指针魔法 (附可视化动画源码)
数据结构·算法
问君能有几多愁~1 天前
C++ 数据结构复习笔记
数据结构·c++·笔记
至乐活着1 天前
深入解析跳表SkipList:原理、实现与性能优化实战
数据结构·算法·跳表·skiplist·java实现