前言
链表和数组都是两个底层的数据结构,只不过我觉得这俩是相反的,在难易程度上链表类型更多一些,想多难一些,但是其实都差不多
1.什么是链表?
它是通过指针,将一个个或者连接,或者不连接的内存块串联起来的数据结构,其中链表里的内存块叫做结点,而结点中不光存储所需要的数据结构,还要存储下一个结点的地址,而记录下个结点地址的指针叫后继指针,在这其中有两个节点比较特殊,分别是第一个节点和和最后一个节点,第一个节点叫头结点,最后一个节点叫尾结点,头结点记录了链表的地址,尾结点不是指向下一个地址,而是指向一个空地址NULL
链表的分类
链表分为三种
1.单链表
头结点记录链表的地址,尾结点指向一NULL,类似一条直线一样的叫做单链表
2.双向链表
每个节点不只有一个后继指针Next,还有一个前驱指针prev指向前面的结点,因为需要额外的空间存储另一个指针,所以双向链表比单链表更占用空间
双链表适合某种情况下的删除和插入,这里的某种情况是指需要对一个已知结点的前面的结点删除或插入操作时,单链表需要重新遍历O(n),而双向链表,还存储前驱指针prev所以在O(1)时间就搞定了
3.循环链表
是一种特殊的单链表,只不过他的尾结点不是指向一个NULl地址,而是指向头结点,他像一个环一样首尾相连
链表的删除和插入操作
在链表里,因为不需要保持数据的连续性,所以插入和删除操作速度快,我们只需要考虑相邻结点指针的改变时间复杂度为O(1)
空间换时间思想
- 对于速度慢的程序,可以使用消耗空间来换取时间来进行优化
- 对于占用内存较大的程序,我们可以采用消耗更多的时间来换取空间来优化
链表和数组比较
数组:
优点:简单易用,因为是连续的内存,所以可以借助CPU缓存机制来预读数组中的数据,访问频率更高
缺点:大小固定,内存分配固定
链表:
优点:支持动态扩容
缺点:没办法预读内存
如果你对代码对内存要求非常严格,那么数组比较适合(因为练笔需要额外的内存来存储下一个结点的地址,而且链表的插入和删除,会导致内存频繁的申请和释放)