链表初识
链表
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但它是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
优点
- 链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
- 使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。
- 由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多。
- 链表允许插入和移除表上任意位置上的节点。
缺点
- 相比于线性表顺序结构,操作复杂。
- 查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。
- 失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。
- 不允许随机存取。
链表的种类
单向链表「头指针法,头节点法,尾指针法」,双向链表以及循环链表。
链表存储原理
头指针法
- 头指针是指向链表第一个结点的指针,若链表有头结点,则是指向头结点的指针
- 头指针具有标识作用,所以常用头指针冠以链表的名字
- 无论链表是否为空,头指针均不为空。头指针是链表的必要元素
头节点法
- 头结点是为了操作的统一和方便而设立的,放在第一个元素之前,其数据域一般无意义,也可用来存储链表状态信息
- 有了头结点,对在第一个元素前插入结点和删除操作,就会和链表中的其他元素一致
- 头结点不是链表必要元素
尾指针法
静态链表
- 用数组描述的链表,即称为静态链表。
- 在C语言中,静态链表的表现形式即为结构体数组,结构体变量包括数据域data和游标CUR【int】。
双向链表「每个节点都拥有各自的直接前驱和直接后继」
它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
循环链表「首尾相接」
单链表的头指针指向链表最后一个节点的地址便可构造一个简单的循环链表。最常用的循环链表是双向循环链表。