线性表之链表

前言

上一篇博客介绍了线性表中的顺序表—它存储的元素在内存中是连续的。但是内存中的数据可以是不连续的,顺序表是处理不了这种情形,因此链表—将内存中不联系的独立的元素链接起来。

链表

什么是链表

概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中next指针链接次序实现的

由此可见链表是一个结构体

另外链表只是将独立的结点链接起来,因此对于那些独立的结点我们可以操作很多事。

链表的分类

链表中按单向或者双向,是否带哨兵结点,是否成环,将链表分为8种,

但是oj题目基本只以2种链表来考察——单向链表,双向带头成环链表,这2种链表在功能和结构上是互补的,下面会分析

单向链表

typedef  int SLTDateType;

typedef struct  SListNode
{
	SLTDateType  date;
	struct SListNode* next;

}SLTNode;

image-20211110232419040

从图中可以看出单链表:

不再需要顺序表那样,必须要存储的元素在内存是连续的。

但是

  • 它不能像数组通过 下标那样,可以直接访问存储的元素,
  • 另外链表去访问元素只能通过next指针一个一个去遍历访问。
  • 另外我们想访问结点前一个元素非常麻烦,只能遍历,因此链表又衍生出—-双向链表,在结构体中设置一个记录prev指针,指向前一个结点。

单链表操作代码实现

博客

双向链表

typedef int  DLDateType;

typedef
struct DList
{
	struct DList* prev;
	  DLDateType date;
	struct DList* next;
}DList;

image-20211111212749856

从图中可以看出

每个结点前一个结点很容易就可以得到,但是对于头结点它的prev指向不好处理。

因此双向链表通常于哨兵结点一起使用。

下面介绍 带头双向链表

哨兵结点

哨兵结点是一个不存储任何数据的结点,设置它的目地是为了解决某些链表结构不好的问题。比如单链表要时刻注意头结点是否为空的问题双向链表头结点的prev指向等问题

带头双向链表

image-20211111213335039

从图中可以看出,有了哨兵结点,我们就不需要考虑链表为空和双向头结点prev指向问题。

带头双向循环链表

演示文稿1

可以看出带头双向循环链表的结构非常复杂,但是我们对它增删减查非常方便。

这与单链表刚好相反,因此我们说单链表和带头双向循环链表是互补的,绝大多数题目都以这2种类型考察。

带头双向循环链表功能复现

博客:

总结

理解链表的关键是理解指针。

多画图,会极大的帮助解决问题

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值