C++数据结构之链表(详解)

主要参考文章地址 01.链表基础知识 | 算法通关手册 (itcharge.cn))

本次内容是对链表的总结,可以看了上面的文章之后。

在看我下面的内容,做一个简短的复习,且本内容的代码均用C++实现,而参考资料的代码则为python。

每一个标题都有一个完整的链接,也可以点击下面的链接。


单链表
双链表
循环链表
内核链表和企业链表
链表的排序

1 链表简介

链表的定义

一种线性表数据结构。它使用一组任意的存储单元,来存储一组具有相同类型的地址,但是链表一般是内嵌到数据结构中,而数据结构的类型可以是不同的。

2 单链表

C++数据结构之链表(详解)_第1张图片

优缺点:

  • 优点:存储空间不必事先分配;一些操作效率远比数组高(插入,移动,删除)
  • 缺点:占用空间比数组多。

3 双链表

简而言之,就是节点同时拥有前驱指针和后继指针。使得使用更加的灵活

4 循环链表

简而言之,就是在双链表的基础上,末尾的后继指针不在指向NULL,而是指向头节点

5 内核链表和企业链表

企业和内核中使用链表,和我们常用的方式有所不同,如下所示,整体可以看作一个数据域,而指针域则内嵌在数据域之中。

C++数据结构之链表(详解)_第2张图片

6 链表的排序

对于链表的排序算法,除了希尔排序之外,且堆排序不建议,其他排序方法都是支持的,如下:

冒泡排序,选择排序,插入排序,归并排序,快速排序,计数排序,桶排序和基数排序。

具体的算法可以参考上述链接。

7 链表的双指针

双指针(Two Pointers):指的是在遍历元素的过程中,不是使用单个指针进行访问。

  • 而是使用两个指针进行访问,从而达到相应的目的。如果两个指针方向相反,则称为「对撞时针」。
  • 如果两个指针方向相同,则称为「快慢指针」。
  • 如果两个指针分别属于不同的数组 / 链表,则称为「分离双指针」。
对撞指针

对于单链表而言,是不能够反向指的,所以一般不会用到对撞指针。可能对于循环链表,可以尝试使用两个指针朝着不同的方向进行移动。

  • 适用范围:一般是在有序的数据结构中使用。
快慢指针

起点不一致的快慢指针

顾名思义,就是两个指针的起点不一样,然后他们的速度可以是一样的。

快指针fast比慢指针slow先走n步,知道快指针移动到链表尾端为止。

  • 比如你要定位到单向链表的指针最后一个节点的前一个节点,那么你就需要两个指针,且前一个指针先走1步。

步长不一致的快慢指针

步长不一致,比如fast指针每次移动2步,慢指针每次移动一步,这样就可以得到链表数据中间的节点。可以借此实现二分法查找。

还可以用来判断链表是否成环问题。

分离双指针

这里最简单的例子就是链表在执行归并排序的时,就需要将左,右两个链表进行合并,就需要两个分离指针进行链表合并。


总结:

因为第7点的内容不多,这里不涉及刷题,所以第7点就直接总结了。

剩下的详细内容,可以在链接中看到。

你可能感兴趣的:(数据结构,算法与思维,数据结构,链表,c++)