一,链表的组成
首先是链表由一个个节点通过指针连接起来那么一个节点的定义是怎么样的呢?
这里面有一个int类型的数据和一个node*类型的指针变量,那么这个指针变量next就负责连接节点。这里给这个节点结构体重命名为node和*linklist,这样就能用指针来声明一个节点。
对于链表来说,我们一般会有头节点和头指针。头节点的作用是为了对链表进行统一的操作,比如我们如果没有头节点,创建第一个节点和第二个节点操作就不同,创建第一个节点时需要把指针域手动置为null,而创建第二个节点时,需要让第一个节点指向它,它本身又要手动给指针域置为null。而使用头节点,增加结点的操作都是一样的,前一个节点指向它,它本身又要手动给指针域置为null。换句话说就是提前创建第一个节点,为了方便。头指针的作用是,指向链表第一个节点,一般头指针就代表这个链表的名字。
二,链表的常见操作
1.链表的初始化
- 先申明一个节点
- 调用初始化函数
- 分配内存
2.链表的插入
- 首先声明一个指针指向链表第一个节点
- 判断插入位置是否合法,后移指针
- 查找到队尾为空,说明没有该节点
- 查找位置成功,生成一个新节点
- 给节点赋值
- 把节点插入链表中
3.链表的读取
- 首先声明一个指针指向链表第一个节点
- 判断查找位置是否合法,后移指针
- 查找到队尾为空,说明没有该节点
- 查找成功,返回数据
4.判断链表是否为空
- 直接判断头节点的指针域是否为空
5.链表的删除
- 首先声明俩个链表指针,其中一个指针指向链表第一个节点
- 判断查找位置是否合法,后移指针
- 查找到队尾为空,说明没有该节点
- 查找成功,用新指针指向节点,把数据保存到指令变量中,做好连接工作
- 释放节点的内存
6.头插法创建单链表:让新节点始终在一个位置
- 声明一个链表指针,初始化一个头节点:定义节点,分配内存,指针域赋值null
- 创建一个循环,循环中创造新节点
- 对新节点的连接 把p的下个节点(指针域)指向头节点的指针域
- 把头节点的指针域指向新节点
7.尾插法创建单链表:让新节点始终在最后一个位置
- 初始化俩个链表类型指针,初始化一个头节点:定义节点,分配内存
- 创建一个循环,循环中创造新节点
- 把尾指针的指针域指向新节点
- 尾指针后移
- 循环结束后给尾指针的指针域置为null
三,链表的类型
- 静态链表,用数组代替链表,这里面数组最后一个节点等价与头节点作用,存放第一个节点的下标,能快速找到该静态链表的第一个节点。该数组第一个元素是特殊的,用来存放空闲空间第一个节点的下标。本质还是数组。
- 循环链表,把最后一个节点的指针域指向头节点,当链表为空是就是判断头节点的指针域是不是等于它本身。
- 双向链表,就是一个节点多了一个指向上一个节点的指针,那么双向链表为空的依据又是什么呢?俩个指针依旧指向它的本身。双向链表的插入操作又是什么呢?首先我们先要把新节点的两个指针域给它指向要插入位置的上一个和要插入的位置,再来断开原链表的连接,把链接和新节点连接起来。
四,总结
对链表的操作,首先要判断当前操作是否合法,比如插入位置和造成链表丢失。其次就是插入,删除链表的操作,要安全的插入,安全的删除,那么安全在链表的定义是什么,是链表顺序和完整。在这个过程中要注意节点会不会丢失。