和数组相同,链表也是一种线性表结构。作为非常基础、非常常用的两种数据结构,数组和链表经常被拿来比较。
链表定义
-
链表是一种线性表数据结构。
-
从底层存储结构上看,链表不需要一整块连续的存储空间,而是通过“指针”将一组零散的内存块串联起来使用。
-
链表中的每个内存块被称为链表的“结点”,每个结点除了要存储数据外,还需要记录上(下)一个结点的地址。
链表特点
-
插入、删除数据效率高,只需要考虑相邻结点的指针改变,不需要搬移数据,时间复杂度是 O(1)。
-
随机查找效率低,需要根据指针一个结点一个结点的遍历查找,时间复杂度为O(n)。
-
与内存相比,链表的空间消耗大,因为每个结点除了要存储数据本身,还要储存上(下)结点的地址。
单链表的引入示例
(为了更好地理解,写得有点low,后一节优化代码)
#include <stdio.h>
struct Test
{
int data;
struct Test* next;
};
int main()
{
struct Test t1={1,NULL};
struct Test t2={2,NULL};
struct Test t3={3,NULL};
t1.next=&t2;
t2.next=&t3;
printf("%d %d %d\n",t1.data,t1.next->data,t1.next->next->data);
return 0;
}
运行结果: