目录
一、关于链表应该了解的
什么是链表,链表是⼀种通过指针串联在⼀起的线性结构,每⼀个节点由两部分组成,⼀个是数据域⼀个是指针域
(存放指向下⼀个节点的指针),最后⼀个节点的指针域指向
null
(空指针的意思)。
链表的⼊⼝节点称为链表的头结点也就是
head
。
优点:和线性表顺序结构相比,链表结构插入,删除操作不需要移动所有节点,不需要初始化容量。
缺点:搜索时必须遍历节点,含有大量引用,占空间大。
缺点:搜索时必须遍历节点,含有大量引用,占空间大。
链表的类型
单链表
单链表:每个节点只有一个指针域,指向下一个节点
双链表
双链表:每⼀个节点有两个指针域,⼀个指向下⼀个节点,⼀个指向上⼀个节点。
双链表 既可以向前查询也可以向后查询
循环链表
循环链表,顾名思义,就是链表⾸尾相连。
循环链表可以⽤来解决约瑟夫环问题。
链表的存储方式
数组在内存是连续分布的,但链表在内存上是不连续的。
链表通过指针域的指针连接内存上各个节点。
所以链表中的节点在内存中不是连续分布的 ,⽽是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理。
如图:
链表的性能分析
链表与数组的性能做对比:
数组在定义的时候,⻓度就是固定的,如果想改动数组的⻓度,就需要᯿新定义⼀个新的数组。
链表的⻓度可以是不固定的,并且可以动态增删, 适合数据ᰁ不固定,频繁增删,较少查询的场景。
二、单链表——single linked list
单链表的定义:
由于顺序表的插入删除操作需要移动大量的元素,影响了运行效率,因此引入了线性表的链式存储——单链表。单链表通过一组任意的存储单元来存储线性表中的数据元素,不需要使用地址连续的存储单元,因此它不要求在逻辑上相邻的两个元素在物理位置上也相邻。
单链表的特点:
- 单链表不要求逻辑上相邻的两个元素在物理位置上也相邻,因此不需要连续的存储空间。
- 单链表是非随机的存储结构,即不能直接找到表中某个特定的结点。查找某个特定的结点时,需要从表头开始遍历,依次查找。
typedef struct ListNode{//定义单链表节点类型
int data;//数据域,节点上存储的元素
struct ListNode * next;//指针域,指向下一个指针
}ListLink,ListNode;//链表,链表节点
单链表初始化:
创建一个空的单链表L,带头结点