第3章 链表
前言
链表(Linked List)是由许多相同数据类型的元素按照特定顺序排列而成的线性表,其特性是计算机内存的位置是不连续与随机(Random)存储的,优点是数据的插入或删除都相当方便,有新数据加入就向系统要一块内存空间,数据删除后,就把空间还给系统,不需要移动大量数据。缺点是设计数据结构时较为麻烦,另外在查找数据时,也无法像静态数据一样可随机读取数据,必须按顺序找到该数据为止。
日常生活中有许多链表的抽象运用,例如可以把“单向链表”想象成自强号火车,有许多人就只挂多少节车厢,当假日人多需要较多车厢时可多挂些车厢,人少了就把车厢数量减少,做法十分弹性。
3.1 单向链表
单向链表是列表中最常用的一种,它就像火车,所有节点串成一列,而且指针所指的方向一样。也就是列表中每个数据除了要存储原本的数据,还必须存储下一个数据的存储地址。所以在程序设计语言中,一个列表节点有两个字段,即数据字段和链接字段组成,列表的组成基本要件为节点,而且每一个节点不必存储于连续的内存地址,并且包含下面两个基本字段:
3.1.1建立单向链表
3.1.2单向链表节点的删除
- 删除列表的第一个节点
- 删除列表内的中间节点
- 删除列表中最后一个节点
3.1.3单向链表的节点插入
- 在列表的第一个节点后插入节点
- 在列表的最后一个节点后面插入节点
- 在列表的中间位置插入节点
3.1.4单向链表的反转
3.1.5单向链表的串联
3.1.5多项式的列表表示法
- 多项式的加法
3.2 环形链表
由单向链表可以衍生出许多有趣的列表结构,比如说环形链表结构,环形列表的特点是在列表的任何一个节点,都可以到达此列表内的各个节点。
3.2.1环形链表的定义
3.2.2环形链表的节点插入
- 将新节点插在第一个节点前成为表头。
- 将新节点I插在任意节点X之后。
3.2.3环形链表的节点删除
- 删除环形链表的第一个节点。
- 删除环形链表的中间节点。
3.2.4环形链表的串联
3.2.5环形链表表示稀疏矩阵
3.3 双向链表
双向链表是另外一种常用的表结构。在单向链表或环形链表中,只能沿着同一方向查找数据,而且如果不小心有一个链接断裂,则后面的链表就会消失而无法救回。双向链表可以改善这两个缺点,因为它的基本结构和单向链表类似,至少有一个字段存放数据,只是它有两个字段存放指针,其中一个指针指向后面的节点,另外一个则指向前面的节点。
3.3.1双向链表的定义
3.3.2双向链表的节点插入
- 将新节点加入此表的第一个节点前
- 将新节点加入此表的最后一个节点之后
- 将新节点加入到ptr节点之后
3.3.3双向链表节点删除
- 删除表的第一个节点
- 删除表的最后一个节点
- 删除表中间的ptr节点
小结
- 链表(Linked List)是由许多相同数据类型的元素所组成的有限序列。和数组不同之处是链表使用易失存储器来存放数据。
- 单向链表(Singly Linked List)中每个数据除了要存储原本的数据,还必须存储下一个数据的存储地址。
- 单向链表的节点删除有3种不同的情形:①删除表中的第一个节点、②删除表中的中间节点、③删除表中的最后一个节点。
- 单向链表在表中的第一节点插入节点:只需把新节点的指针指向表头,再把表头指针移到新节点上即可。
- 单向链表在表中的最后一个节点后面插入节点:把表中的最后一个节点的指针指向新节点,新节点再指向null即可。
- 单向链表在表中的中间位置插入节点:如果插入的节点是在X与Y之间,只需要将X节点的指针指向新节点,新节点的指针指向Y节点即可。
- 多项式的数组表示法经常会出现以下的困扰:①多项式内容经常变动,对数组结构的影响相当大,算法处理不易。②由于数组是静态数据结构,所以事先必须寻找一块连续且够大的内存,容易形成内存空间的浪费。
- 环形链表建立的过程与单向链表相似,唯一的不同点是必须要将最后一个节点指向第一个节点。
- 环形链表插入节点时,通常会出现两种情况:①直接将新节点插在第一个节点前成为表头。②将节点I插在任意节点X之后。
- 双向链表每个节点具有3个字段,中间为数据字段,左右各有两个链接字段,分别为LLINK和RLINK,其中RLINK指向下一个结点,LLINK指向上一个结点。
- 双向链表的节点加入有3种可能情况:①将新节点加入此表的第一个节点前。②将新节点加入此表的最后一个节点之后。③将新节点加入到ptr节点之后。