链表经验分享
一、 指针
指针在c语言中常用来表示内存地址,或称指针指向了内存地址。指针变量的类型应与指针所指向的变量类型益智,指针所指向的变量类型不同,其所占用的内存大小也不同。
二、 单向链表
1、基本构成
计算机的常见储存结构有顺序存储和链式存储,一个由数组实现, 一个由链表实现。
| 结构类型 | 特点 | 优点1 | 优点2 | 缺点1 | 缺点2 |
|---|---|---|---|---|---|
| 顺序存储结构 | 连续地址存放,逻辑关系与物理关系相同 | 操作方便,随机存取,查找元素复杂度为O(1) | 需要预先开辟数组空间,大小不好把控 | 插入或删除元素不便,时间复杂度为O(n) | |
| 链式存储结构 | 用一组非连续的存储单元存储结点数据,长度不定 | 存储空间是动态分配的,一般不会发生溢出 | 插入或删除元素方便,时间复杂度为O(1) | 查找元素不方便,遍历复杂度为O(1) |
单向链表结点的构成结构
数据域(存储元素本身) 指针域(指向下一个结点) 数据域(存储元素本身) 指针域(指向下一个结点)
链表中的第一个结点称为头结点(head),最后一个结点称为尾结点(tail头结点一般不储存数据,尾结点指针指向空。
图中的链表每个结点都只包含一个指针域,所以称为单链表。
2、构建单链表
- 定义结构体存储结点信息:
- 创建头结点和尾结点,头结点起带头作用,尾结点用于添加新结点:
- 创建多个新结点,依次链接到尾结点后
3、单链表操作
- 打印单链表:
- 查找链表元素:
- 删除结点:
- 插入结点:
三、 循环链表
单向循环链表是另一种形式的链式存储结构,特点为表中最后一个结点的指针指向头结点,链表形成闭环。
实现代码:
四、 双向链表
1、基本构造
双向链表每个结点有两个指针域和若干数据域,其中在前的指针域指向它前面的结点,在后的指针域指向它后面的结点。优点是访问、插入、删除更方便,速度也快了,但是以空间换时间。
2、构建双向链表:
3、双向链表的操作:
- 删除结点:
- 插入结点:
五、 数组模拟实现双链表
通常,链表的指针写法会出现在初赛的选择题中,而代码实现会使用数组模拟的方式。
双链表的一个节点包括节点的值、节点的left指针、节点的right指针。
left指针存储该节点的左侧节点的下标; right指针存储该节点的右侧节点的下标。
数组e、数组1和数组r通过下标相等,每三个关联作为一个完整的节点,即e[2]、1[2]、[2]; e[3]、 [[3]、 r[3]; e[4]、[[4]、 r[4] …
代码片段:
-
初始化:
-
插入操作:
z
- 删除操作:
六、 例题
题目描述:
代码示例: