1. 链表简介
① 和vector一样,链表也是一种线性表。
② 从内存结构来看,链表的内存结构是不连续的内存空间,是将一组零散的内存块串联起来,从而进行数据存储的数据结构。
③ 链表中的每一个内存块被称为节点Node。
单向链表:节点除了存储数据外,还需记录下一个节点的地址,即后继指针next。
双向链表:节点除了存储数据外,还需记录上一个节点和下一个节点的地址,即前驱指针front和后继指针next。
④ 链表由一系列结点组成,结点可以在运行时动态生成
2. 链表特点
① 插入、删除数据效率高,时间复杂度为O(1)级别(只需更改指针指向即可);但是,随机访问效率低,时间复杂度O(n)级别(需要从链头至链尾进行遍历)。
② 和数组相比,内存空间消耗更大,因为每个存储数据的节点都需要额外的空间存储后继指针。
3. 常用链表
单向链表
双向链表
双链表相对于单链表的优点:
删除单链表中的某个节点时,一定要得到待删除节点的前驱,得到其前驱的方法一般是在定位待删除节点的时候一路保存当前节点的前驱,这样指针的总的的移动操作为2n次,如果是用双链表,就不需要去定位前驱,所以指针的总的的移动操作为n次。
查找时也是一样的,可以用二分法的思路,从头节点向后和尾节点向前同时进行,这样效率也可以提高一倍,但是为什么市场上对于单链表的使用要超过双链表呢?从存储结构来看,每一个双链表的节点都比单链表的节点多一个指针,如果长度是n,就需要n*lenght(32位是4字节,64位是8字节)的空间,这在一些追求时间效率不高的应用下就不适用了,因为他占的空间大于单链表的1/3,所以设计者就会一时间换空间。
4. 结构体实现
struct node //结点结构
{ int data ; //数据
node * next; //指针
};