数据结构与算法(1)数组与链表

学习极客时间数据结构与算法之美总结

数组

  1. 数组是在内存上连续的内存空间。
  2. 数组随机查找算法复杂度为O(1),但是插入和删除都为O(n)(这个要看情况,要是数据不是按照顺序的话,那么直接把目标位置替换成新的值,然后将旧的值放到最后,这样算法复杂度依然为O(1),删除的时候把删除的地方做标记,等到空间不足的时候再将所有删除的地方全部移除,其他元素进行前移,这样算法效率同样有提升,有点像JVM的标记回收法)
  3. 由于内存的碎片化很可能造成没有足够的连续空间给新的数组,这样造成OOM异常。
  4. 数组长度不够用的时候动态扩容,是申请一个更大的数组,然后将原来的数组数据复制进去。

链表

链表分为单向链表、双向链表、循环链表、双向循环链表。
链表靠着指针之乡前(后)数据,这样就意味着不需要连续的空间,零散的空间就可以使用了,但是会占用空间来存放指针。

单向链表

  1. 单向链表只有一个向后的指针,头节点、尾节点,头节点是链表的开头,尾节点向后的指针为NULL。
  2. 单向链表遍历(查询)的时间复杂度为O(n),插入和删除的时间复杂度是O(1)(这个要看情况,如果已经在要删除的位置了,那么时间复杂度是O(1),但是如果没有在要删除的位置的话,那么还需要遍历寻找,这样时间复杂度还是O(n))。

双向链表

  1. 双向链表不仅有一个向后的指针,还有一个向前的指针。
  2. 双向链表遍历查询的时间复杂度为O(n),插入和删除的时间复杂度是O(1)(这个也要看情况,具体与单向链表类似)。
  3. 其与单向链表优点是在插入删除的时候,因为要更改前面一个节点的后向指针,但是单向链表如果当时没有进行记录的话,需要从头进行查询,这样时间复杂度是O(n),但是双向链表因为有着前向指针,所以时间复杂度是O(1),缺点是需要额外的空间保存前向指针
  4. 在查询的时候,如果链表是有序的话,那么可以保存当前的查询的位置,然后下次查询的时候可以与这次位置比较,根据大小和链表的排序情况,选择前向和后向运动查找,这样时间效率更高。

循环链表和双向循环链表

循环链表和双向循环链表有着类似的结构,就是头和尾相连,具体还没有体会其用法,等之后再进行补充。

链表需要关注重要练习

  1. 反转链表(https://leetcode-cn.com/problems/reverse-linked-list/)
  2. 链表中环的检测
  3. 两个有序的链表合并
  4. 删除链表倒数第 n 个结点
  5. 求链表的中间结点

猜你喜欢

转载自blog.csdn.net/ws948342046/article/details/87092992