主要参考文章地址 01.链表基础知识 | 算法通关手册 (itcharge.cn))
本次内容是对链表的总结,可以看了上面的文章之后。
在看我下面的内容,做一个简短的复习,且本内容的代码均用C++实现,而参考资料的代码则为python。
每一个标题都有一个完整的链接,也可以点击下面的链接。
单链表
双链表
循环链表
内核链表和企业链表
链表的排序
1 链表简介
链表的定义
一种线性表数据结构。它使用一组任意的存储单元,来存储一组具有相同类型的地址,但是链表一般是内嵌到数据结构中,而数据结构的类型可以是不同的。
2 单链表
优缺点:
- 优点:存储空间不必事先分配;一些操作效率远比数组高(插入,移动,删除)
- 缺点:占用空间比数组多。
3 双链表
简而言之,就是节点同时拥有前驱指针和后继指针。使得使用更加的灵活
4 循环链表
简而言之,就是在双链表的基础上,末尾的后继指针不在指向NULL,而是指向头节点
5 内核链表和企业链表
企业和内核中使用链表,和我们常用的方式有所不同,如下所示,整体可以看作一个数据域,而指针域则内嵌在数据域之中。
6 链表的排序
对于链表的排序算法,除了希尔排序之外,且堆排序不建议,其他排序方法都是支持的,如下:
冒泡排序,选择排序,插入排序,归并排序,快速排序,计数排序,桶排序和基数排序。
具体的算法可以参考上述链接。
7 链表的双指针
双指针(Two Pointers):指的是在遍历元素的过程中,不是使用单个指针进行访问。
- 而是使用两个指针进行访问,从而达到相应的目的。如果两个指针方向相反,则称为「对撞时针」。
- 如果两个指针方向相同,则称为「快慢指针」。
- 如果两个指针分别属于不同的数组 / 链表,则称为「分离双指针」。
对撞指针
对于单链表而言,是不能够反向指的,所以一般不会用到对撞指针。可能对于循环链表,可以尝试使用两个指针朝着不同的方向进行移动。
- 适用范围:一般是在有序的数据结构中使用。
快慢指针
起点不一致的快慢指针
顾名思义,就是两个指针的起点不一样,然后他们的速度可以是一样的。
快指针fast
比慢指针slow
先走n步,知道快指针移动到链表尾端为止。
- 比如你要定位到单向链表的指针最后一个节点的前一个节点,那么你就需要两个指针,且前一个指针先走1步。
步长不一致的快慢指针
步长不一致,比如fast指针每次移动2步,慢指针每次移动一步,这样就可以得到链表数据中间的节点。可以借此实现二分法查找。
还可以用来判断链表是否成环问题。
分离双指针
这里最简单的例子就是链表在执行归并排序的时,就需要将左,右两个链表进行合并,就需要两个分离指针进行链表合并。
总结:
因为第7点的内容不多,这里不涉及刷题,所以第7点就直接总结了。
剩下的详细内容,可以在链接中看到。