第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节点之后。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值