前言:
上一篇文章我们初步介绍了 List 以及 ArrayList,我们不难发现使用 ArrayList 过程中,对元素进行操作可能会涉及到大量数据的改变,所以LinkedList “临危受命”,本篇文章将从链表的相关概念入手,对单向、双线链表进行模拟实现,再回到 LinkedList 集合内当中进行简单分析,最后结合上一篇文章,阐述四点 LinkedList 和 ArrayLIst 区别。如果有需要快速了解两者区别的朋友可以直接跳转 ArrayList 和 LinkedList的区别
- 希望能对各位看官朋友有所裨益,如有问题欢迎批评指正
重点:
1 单链表
1.1 链表和单链表
1)链表
(1)是什么
- 链表是线性表的一种表现形式
- 链表在逻辑上是连续的,在物理上 不一定连续
- 节点资源是从堆中申请的,多次申请可能连续也可能不连续
(2)分类
通过下面的三种特征可以自由组合成 8 种链表结构
-
带头 / 不带头
-
带头双向链表常出现与对于 链表结构有修改操作 的题目中,可以省去很多特殊情况的判断
-
常见是创建一个虚拟头结点(哨兵节点)dummy,头插至链表中
删除有序链表中重复的元素-II 有兴趣可以尝试一下删除链表元素经典题目
-
- 单向 / 双向
- 笔试中多用单向链表(双向链表容易很多怎么舍得考呢(doge)),后面的部分也会介绍关于双向链表的内容
- 循环 / 非循环
- 虽然非循环是主流,但循环链表也有不少的题型,要有所注意
2)单链表
-
这里我们指的是 单向不带头非循环 链表,也是面试笔试的高频问题之一
-
实际情况中,单链表一般是作为其他数据结构(哈希桶、图…)的子结构
有兴趣可以尝试一下 牛客网面试必刷 TOP101 的链表题目,都很具有代表性,博主后续也会跟进个人关于单链表的刷题记录,可以点个关注不迷路哦
1.4 MyLinkedList 模拟实现
不带头单向非循环链表
-
Node 类
-
成员变量
- int val
- Node next
-
构造方法
- Node (int val) { this.val = val}
-