这篇文章是关于链表的专题文章,总结的是剑指offer中的链表的相关知识。有关链表的具体知识可以看这篇文章。
引用维基百科中的话:链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表(数组)快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O(1)。
链表作为一种基础的数据结构可以用来生成其它类型的数据结构如堆栈或队列。链表通常由一连串节点组成,每个节点包含任意的实例数据(data fields)和一或两个用来指向上一个/或下一个节点的位置的链接("links")。如下图所示,以单向链表为例。
下面开始剑指offer中的题目。
1. 剑指offer第6题:从尾到头打印链表
这道题的题目描述和代码实现见下图:
这是一道很简单的链表相关的题目,不再赘述。
2. 剑指offer第18题:删除链表的节点
这道题的题目描述和代码实现见下图:
这道题同时衍生了其变形题目:删除链表中的重复节点。不再进行赘述。
3. 剑指offer第22题:链表中倒数第k个节点
这道题的题目描述和代码实现见下图:
其中第一道题目的第二种解法的图解如下:
4. 剑指offer第23题:链表中环的入口节点
这道题的题目描述和代码实现见下图:
寻找环的入口节点的图解如下:
5. 剑指offer第24题:反转链表
这道题的题目描述和代码实现见下图:
反转链表的图解如下:
6. 剑指offer第25题:合并两个排序的链表
这道题的题目描述和代码实现见下图:
合并链表的示意图如下:
7. 剑指offer第35题:复杂链表的复制
这道题的题目描述和代码实现见下图:
这道题目的图解过程如下:
8. 剑指offer第36题:二叉搜索树与双向链表
这道题的题目描述和代码实现见下图:
假设将下图的二叉搜索树转换为双向链表:
此过程的图解如下:
9. 剑指offer第52题:两个链表的第一个公共节点
这道题的题目描述和代码实现见下图:
测试函数中创建的链表如下: