数据结构-链表

链表与数组是个相对互补,数组不足的地方恰好用链表可以满足,它也算基础数据结构,可用来表示其他逻辑数据结构。

链表在物理上并不要求连续,有序,每个变量被称为节点,节点内包含的数据变量类型也不要求一致。所以链表可以充分利用内存中零散的空间,来组成集合。

链表的特点在于一个节点链接着一个节点,通常我们只知道头节点,用头节点表示整个链表。这样一来要查找链表中的某个节点元素就要从头遍历,因此,链表在查找上的时间复杂度为 O(n)。假设当前已经找到待更新的节点,那么时间复杂度即为 O(1)。

链表的新增需要根据情况来梳理,

  1. 从头节点新增插入
    这种方式叫头插法,也可分两种,一种是插入到头节点后面,这种方式的头节点一般不带数据,仅作为头节点。另一种是插入到头节点前面,作为新的头节点。因为已经头节点和待新增节点,所以时间复杂度为 O(1)

  2. 从中间某个节点新增插入
    这种方式以及尾部新增的方式执行的前提是要查找到相应插入位置节点,如果不考虑查找过程,那么时间复杂度依然会是 O(1)。找到位置之后,中间新增插入的过程就和头插法很相似了。

  3. 从尾部新增插入
    尾插法在找到尾节点后,将尾节点的下一个节点指向待新增节点,并让新增节点的下一个节点指向空即可。

综上,链表的新增节点在不考虑查找过程下,操作的时间复杂度为 O(1)。

链表的删除同样也需要根据情况来梳理,

  1. 从头节点删除
    这里也要看头节点是否带数据,一种是让头节点指向头节点下一个节点,这样就删除了原有头节点,一种是头节点的下一个节点指向原本下一个节点的下一个节点。

  2. 从中间某个节点删除
    首先要找到待删除节点的前一个节点,让这个节点的下一个节点指向待删除节点的后一个节点,这样待删除节点就被架空的感觉,也就删除了。

  3. 尾节点删除
    只要找到尾节点前一个节点,让这个节点的下一个节点指向空就行了。

综上,链表的删除节点,操作的时间复杂度也为 O(1)。

可见链表在增,删操作上相对数组是有优势的,而在查找方便不如数组。

参考内容

「漫画算法-小灰的算法之旅」

你可能感兴趣的:(数据结构-链表)