链表的定义
定义 : 链表 是一种物理存储单元上 非连续、非顺序 的存储结构,由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。
在链表的储存上,每个结点不仅包含所存的元素信息,还包含元素间的 逻辑信息 。
在每个结点除了包含的数据域外,还包含一个 指针域 ,用以指向其后继结点。
带头结点的单链表中, 头指针head 指向头结点,头结点的值域不含任何信息,从头结点的后继结点开始储存信息。头指针head 始终 不等于NULL , head->next 等于NULL的时候,链表为空。
不带头结点的单链表中的 头指针head 直接指向开始结点,当head等于NULL时,链表为空。
双链表就是在单链表结点上增添了一个指针域,指向当前节点的 前驱 。
相比于单链表,双链表能够从 终端结点 反向走到 开始结点 。
只需要将单链表 最后一个 指针域( 空指针 )指向链表中的 第一个结点 即可。(如果循环单链表带头结点,则指向头结点;不带头结点,则指向开始结点)。
循环单链表可以实现从 任何一个结点 出发,访问链表中任何结点。(注意:此处应该区分与顺序表随机访问的特点。循环单链表指的是从一个结点出发,而不是知道一个结点从而迅速找到任何一个结点,因此循环单链表 不具有 随机访问特性。)
带头结点 的循环单链表,当 head 等于 head->next 时,链表为空; 不带头结点 的循环单链表,当 head 等于 NULL 时,链表为空。
双链表 终端节点的next指针 指向链表中第一个结点,将链表中的第一个结点的 prior指针 指向终端结点。
不带头结点 的循环双链表, head 等于 NULL ,链表为空
带头结点 的循环双链表是没有空指针的,其为空状态下, head->next 与 head->prior 必然都等于 head ,故一下四种语句都可判断为空
静态链表借助 一维数组 表示。
静态链表结点空间来自于一个 结构体数组 (一般链表结点空间来自整个内存),数组中每个结点含两个分量:
注意:静态链表的指针不是通常所说储存内存地址的指针型变量,而是储存数组下标的整型变量,其功能类似于指针,故在此称为指针
顺序表储存空间时一次性分配的,链表的是多次分配的
(注: 存储密度 = 结点值域所占存储量/结点结构所占存储总量 )
顺序表存储密度 = 1
链表存储密度 < 1
顺序表可以 随机存取 ,也可以 顺序存取
链表只能 顺序存取
顺序表平均需要移动一半元素
链表不需要移动元素,仅需 修改指针