单链表、循环链表、双向循环链表总结

链表介绍

结点的概念:

一个结点包含两个信息,一个是数据域和一个是指针域:

  • 数据域存储该结点的数据信息
  • 指针域存储其直接后继的位置,其示意图如下:
    在这里插入图片描述

链表的概念:

每个结点的存储单元是独立的,若干个结点通过指针域依次相链接可构成一个链表,这样的结构称为线性表的链式存储,简称链表。其示意图如下:
在这里插入图片描述

为了能够表示链表的开始和结束,需要增加头指针L表示链表的开始,而指针域设置为NULL表示结点的结束。

不带头结点的单向链表

在这里插入图片描述
不带头结点的单向链表是最原始的链表,其头指针指向第一个数据元素,若是空链表其头指针的值为NULL。
在这里插入图片描述
由于不带头结点的链表在第一个元素插入和删除时带来不方便,因此链表初始化时,我们都需要增加一个头结点,并令头指针指向头结点,后续的链表默认都是带头结点的。其区别参见这篇文章 链表头结点和不带头结点的区别

带头结点的单向链表

在没有特殊指明情况下,我们创建的链表默认都应该带头结点,其初始化状态为如下图所示:
在这里插入图片描述
带有数据元素的链表示意图:
在这里插入图片描述

循环链表

循环链表是单向链表的一种特殊形式,可以用于解决约瑟夫环问题。循环链表的最后一个结点的后继指向的是头结点,而不是NULL。其空循环链表的示意图如下:
在这里插入图片描述
带有数据元素的循环链表示意图如下:
在这里插入图片描述

在某些特殊情况下(比如需要频繁以追加方式插入新结点),我们可以令头指针指向最后一个结点,或者新增加一个尾指针一直指向最后一个结点,其示意图如下:
在这里插入图片描述
当头指针指向最后一个结点时或者增加尾指针,可以使得查找链表的开始结点和最后一个结点都方便,其执行时间为O(1). 而在一般情况下,其执行时间为O(n)。

双向循环链表

单向链表存在一个弊端就是,当需要获取某个结点p的前驱时,需要从头指针开始遍历链表,获得“前驱”的执行时间为O(n),为了克服单向链表的这种缺点,可以利用双向链表。

在双向链表中有两个指针域,一个是指向前驱结点的prev,一个是指向后继结点的next指针。下图是空的双向循环链表示意图:

在这里插入图片描述

带有数据元素的双向循环链表示意图如下:

在这里插入图片描述

双向循环链表的插入和删除结点执行时间均为O(1),为常量级。和其他结构的链表体现了其优越性。

总结

以下这张是带头结点的单链表、循环链表以及双向循环链表的总结:

在这里插入图片描述

发布了281 篇原创文章 · 获赞 327 · 访问量 66万+

猜你喜欢

转载自blog.csdn.net/xiao3404/article/details/103191963
今日推荐