一、链表是什么
链表(Linked List)是一种常见的线性数据结构,它用于存储具有相同数据类型的元素的集合。链表中的元素(通常称为节点)在内存中不必连续存储。每个节点包含两个部分:一个存储数据的部分(数据域)和一个存储指向下一个节点地址的部分(指针域)。
根据节点之间的链接方式,链表可以分为以下几种:
- 单向链表(Singly Linked List): 单向链表的每个节点只包含一个指向下一个节点的指针。在单向链表中,你只能沿一个方向遍历元素。
- 双向链表(Doubly Linked List): 双向链表的每个节点包含两个指针,一个指向下一个节点,另一个指向前一个节点。这使得在双向链表中,你可以沿两个方向遍历元素。
- 循环链表(Circular Linked List): 循环链表是一种特殊类型的链表,其中最后一个节点指向第一个节点。循环链表可以是单向的或双向的。
链表与数组相比具有一些优点,例如插入和删除操作的时间复杂度通常较低。但是,链表的访问速度较慢,因为你需要从头开始遍历链表来查找特定元素。链表是计算机科学和编程中的基础数据结构之一,在很多场景下都有广泛应用。
链表
链表的实际用途非常广泛,但是一般业务代码不会涉及。一般都在操作系统里,例如文件系统、内存分配;还有哈希表中, 可以用来解决冲突(key冲突时使用链表或者数组来保存);实现跳跃表等等。
链表结构和特征
首先我们来看看链表的结构。链表根据结构通常分为单向链表和双向链表,因为链表中总是有一个地方存储下 一个节点的位置,因此我们抽象来看,它是有方向的。只存储下一个或上一个节点位置的链表,我们称之为单向 链表,既存储上一个节点位置,又存储下一个节点位置的链表,我们称之为双向链表。
链表和数组的对比
链表和数组,都是用来存储一批数据的,那么链表和数组有什么不同之处呢?我们回顾一下,数组的结构是这样的:
可以明显的看出来,数组中,每一个元素都是互相挨着的,也就是说,它们是相邻的。当然,数组中的节点也可以 是不相邻的,即中间有很多地方没有填充元素,是一个个的空洞,但是我们一般不会这样用:
原因是特别浪费空间,为了存储1和101,中间有99个元素空间是空着的,而这种场景就特别适合链表,用链表来 表示节点的话,尽管会多了一个(如果是单项链表的话)或两个(如果是双向链表的话)指针的空间,但是仍然 比数组来表示更加节省空间。
也就是说,链表比数组更加适合用来存储不相邻的、零散的数据,而数组更适合用来存储连续的数据。除此之外, 试着想象一下,如果在数组中插入一个元素,我们需要怎么操作?答案是,我们需要先找到位置,然后把该元素 及其后的元素整体往后搬,然后再把该元素写入。
而链表则不是,找到位置之后,新建一个节点,把元素的值存储到该节点,之后更改前后节点的指针的值即可。
链表和数组还有很多的不同,如果有兴趣的话,可以看参考资料中的链表vs数组,而我们在这一节中,只要记住 链表和数组最大的不同之处,就在于链表适合用来存储零散的数据,而数组适合存储连续的数据。
二、Java链表实现
在 Java 中,链表方向主要指的是链表的实现方式以及 Java 标准库中的链表类。
- Java 链表实现: Java 中可以自行实现单向链表、双向链表和循环链表。为此,需要创建一个链表类(如 LinkedList)和一个节点类(如 Node)。在这些类中,你需要实现一些基本操作,例如添加、删除、查找和修改元素。
- Java 标准库中的链表类: Java 标准库提供了一个名为 java.util.LinkedList 的链表实现,它是一个双向链表。这个类实现了 List 接口,因此具有与其他 List 实现(如 ArrayList)相同的方法。通过熟悉 LinkedList 类及其 API,你可以了解如何在 Java 中使用链表。
在学习 Java 链表方向时,建议从以下几个方面入手:
- 学习基本的链表概念和原理,了解单向链表、双向链表和循环链表的区别。
- 实现自己的链表类和节点类,熟悉基本操作(如添加、删除、查找和修改)。
- 学习 Java 标准库中的 LinkedList 类,了解其实现方式和 API 用法。
- 通过实战练习巩固链表知识,可以在 LeetCode、HackerRank 等在线平台上找到链表相关的编程题进行练习。
- 扩展学习其他相关的数据结构,例如栈、队列和树。
这些步骤将帮助你在 Java 中掌握链表的使用和实现。在学习过程中,多做实战练习和总结归纳,对你的学习效果会有很大帮助。
→ 部分内容参考Jiajun的编程随想:https://jiajunhuang.com/tutorial/data_structure/linkedlist.md
侵删!