😽博主优快云主页:小源_😽
🖋️个人专栏:《数据结构》🖋️
😀努力追逐大佬们的步伐~
目录
1.前言
我们都知道,ArrayList的底层是一段连续的空间,在ArrayList任意位置插入或者删除元素时,就需要将后续元素整体往前或往后搬移,时间复杂度为O(n),效率比较低,并且在插入元素遇到扩容时,有可能会浪费空间,所以ArrayList不适合做任意位置插入和删除比较多的场景。因此,java集合中又引入了LinkedList,即链表结构。
本章重点:
本文着重讲解了链表的结构和无头单向非循环链表的实现。
2. 链表
2.1 链表的概念及结构

链表类似火车一样,它是由一个一个节点/结点(车厢)组成的。我们可以把头节点比作火车头,把后面的节点比作火车的车厢,把利用每个节点中存放的下一个节点的地址来连接每一个节点比作火车之间的铁钩。
链表的每个节点都分为两个部分,一个是val/dadta域(用来存放值),另一个是next域(用来存放下一个节点的地址)。最后一个节点的next域为null。

2.2 链表的结构分类
1.单向后者双向
2.带头后者不带头
3. 循环或者非循环
虽然有这么多的链表结构,但是我们重点掌握这两种:
1.无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多
2.无头双向链表: 结构复杂,一般用来单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然复杂,但是在后面模拟实现的时候就能发现它有很多特点,反而变简单了。
3. 无头单向非循环链表的模拟实现
3.1 定义IList接口
public interface IList {
//头插法
void addFirst(int data);
//尾插法
void addLast(int data);
//任意位置插入,第一个数据节点为0号下标
void addIndex(int index,int data);
//查找是否包含关键字key是否在单链表当中
boolean contains