这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战
前言
在上一篇文章中,我们谈到了数组这个基本的数据结构,数组需要分配一块连续的内存块,连续的内存块带给数组随机访问的能力,那么相对的,也会带来一定的局限性,这个局限性就是假如内存中没有足够的空间分配这个数组的话,那么这个数组就会分配失败,所以由此产生了另一个数据结构——链表。
单链表
单链表不需要连续的内存空间,通过指针将一组连续的内存块串联在一起,使用一个额外的内存来存储只想后置节点的指针,尾节点的指针指向NULL,所以单链表的概念非常简单,由若干个结点组成,结点上存放数据和后置指针,由此串联在一起。那么由此可以很清晰的知道链表的优缺点了。
优势:增加结点和删除节点的速度非常快。只需要将后置指针指向新的结点,新的结点的后置指针指向原有位置。 劣势:查找的速度比较耗时间,指定某个索引位置要从头节点开始遍历。
虽然做插入和删除操作非常快,但是定位到插入和删除的位置,也需要从头开始遍历的。插入和删除所以平均时间复杂度也是O(n)。单向链表每次都要从头开始遍历整个链表,这样的灵活性不是很好,由此在单向链表的基础上,优化产生了另一个数据结构——双向链表。
双向链表
双向链表在结点上存放两个指针,分别是前驱指针,指向上一个的结点,后置指针,指向后一个结点,虽然多消耗了一个指针的位置,但是可以从当前结点执行双向遍历,极大的提高了灵活性。Java中的集合类LinkedList内部就是使用双向链表来实现的。
结论
我们今天讨论了新的数据结构——链表。如果在频繁的插入和删除操作的场景下,链表会更加适合。避免数组的移动开销。也能更好的提高内存的利用率。