1.双链表数据结构
List和Deque接口的双链表实现。[…] 所有的操作都能像双向列表那样执行。索引该列表中的操作将从头或者尾遍历列表,使用更接近指定索引的那个。
- 每个节点包含下一个节点的链接和上一个节点的链接。
LinkedList对象包含指向列表的第一个和最后一个元素的链接。
所以我们可以从列表的任意一端开始,并以任意方向遍历它。因此,我们可以在常数时间内,在列表的头部和末尾添加和删除元素!
2.ArrayList,LinkedList和双链表的对比
| MyArrayList | MyLinkedList | 双链表 | |
|---|---|---|---|
add(末尾) | 1 | n | 1 |
add(开头) | n(剩余的都往后) | 1 | 1 |
add(一般) | n | n | n |
get / set | 1 | n | n |
indexOf / lastIndexOf | n | n | n |
isEmpty / size | 1 | 1 | 1 |
remove(末尾) | 1 | n | 1 |
remove(开头) | n | 1 | 1 |
remove(一般) | n | n | n |
3.结构的选择
对于头部插入和删除,双链表的实现优于ArrayList。对于尾部插入和删除,都是一样好。所以,ArrayList唯一优势是get和set,链表中它需要线性时间,即使是双链表(根据实际需要解决的问题来看)。
如果你知道,你的应用程序的运行时间取决于get和set元素的所需时间,则ArrayList可能是更好的选择。如果运行时间取决于在开头或者末尾附加添加和删除元素,LinkedList可能会更好。
但请记住,这些建议是基于大型问题的增长级别。还有其他因素要考虑:
- 如果这些操作不占用你应用的大部分运行时间 - 也就是说,如果你的应用程序花费大部分时间来执行其他操作 - 那么你对
List实现的选择并不重要。 - 如果你正在处理的列表不是很大,你可能无法获得期望的性能。对于小型问题,二次算法可能比线性算法更快,或者线性可能比常数时间更快。而对于小型问题,差异可能并不重要。
- 另外,别忘了空间。到目前为止,我们专注于运行时间,但不同的实现需要不同的空间。在
ArrayList中,这些元素并排存储在单个内存块中,所以浪费的空间很少,并且计算机硬件通常在连续的块上更快。在链表中,每个元素需要一个节点,带有一个或两个链接。链接占用空间(有时甚至超过数据!),并且节点分散在内存中,硬件效率可能不高。
总而言之,算法分析为数据结构的选择提供了一些指南,但只有:
- 你的应用的运行时间很重要,
- 你的应用的运行时间取决于你选择的数据结构,以及,
- 问题的规模足够大,增长级别实际上预测了哪个数据结构更好。
作为一名软件工程师,在较长的职业生涯中,你几乎不必考虑这种情况。
本文对比了双链表、ArrayList和LinkedList的数据结构性能,详细分析了它们在不同操作(如add、get、remove等)上的时间复杂度,以及如何根据应用场景选择合适的数据结构。
双链表&spm=1001.2101.3001.5002&articleId=89225105&d=1&t=3&u=57dab64024d14583929550a39e512cb1)
5558

被折叠的 条评论
为什么被折叠?



