【数据结构笔记】单链表

链表线性表的一种存储结构。关于线性表的概念,可以查看上一篇笔记【数据结构笔记】顺序表——静态分配

什么是链表?

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。其在物理地址上的存储示意图如下:

链表的分类

链表分为:单链表、循环单链表、双链表、循环双链表、静态链表。

单链表的概念
1
单链表的组成

链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域

2
结点的分类

结点可分为:头结点、开始结点(首元结点)、其他结点。

(1)头结点:其值域不包含任何信息。不是必须的,根据实际情况建立。

(2)开始结点:开始结点也称做首元结点,代表链表中第一个存有数据的结点。

(3)其他结点:除了头结点与开始结点之外的结点。

3
前驱与后继

链表的相邻元素之间存在着序偶关系。如用(a1,…,ai-1,ai,ai+1,…,an)表示一个链表,则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。

当i=1,2,…,n-1时,ai有且仅有一个直接后继,当i=2,3,…,n时,ai有且仅有一个直接前驱。

(ps:顺序表前驱和后继的概念也是如此)

5
头指针

头指针head永远指向链表第一个节点的位置,头指针用于指明链表的位置,便于后期找到链表并使用表中的数据。

链表中有头结点时,头指针指向头结点;反之,若链表中没有头结点,则头指针指向开始结点。链表完整示意图如下:

6
带头结点与不带头结点的单链表

(1)带头结点的单链表:头指针head指向头结点。头指针head始终不等于NULL,head->next等于NULL的时候链表为空。

(2)不带头结点的单链表:头结点head指向开始结点,当head等于NULL时链表为空。

单链表的操作示例
1
单链表结点的定义
/* 数据元素类型 */
typedef int ListType;

/* 单链表结点定义 */
typedef struct LNode
{
 ListType data;      //数据域
 struct LNode *next; //指针域,指向直接后继元素
}LNode;

2
创建一个链表

使用头插法创建一个链表:(5,2,0,13,14),代码如下

3
链表中查找某结点

因为链表不支持随机访问,即链表的存取方式是顺序存取的(注意“存储”与“存取”是两个不一样的概念),所以要查找某结点,必须通过遍历的方式查找。

例如:如果想查找第5个结点,必须先遍历走过第1~4个结点,才能得到第5个结点。代码如下:

4
修改某结点的数据域

要修改某结点的数据域,首先通过遍历的方法找到该结点,然后直接修改该结点的数据域的值。代码如下:

5
往链表中插入结点

插入结点的位置有三种:

(1)插入到链表的首部,也就是头结点和开始结点之间;

(2)插入到链表中间的某个位置;

(3)插入到链表的末端。

虽然插入的位置有区别,都使用相同的插入手法。分为两步,如上图所示:

(1)将新结点的next指针指向插入位置的后一个结点;

(2)将插入位置的前一个结点的next指针指向插入结点。

代码如下:

6
删除链表结点

当需要从链表中删除某结点时,需要进行两部操作:

(1)将结点从链表中摘下来,即修改指针指向为:被删除结点的前一个结点的next指针指向被删除结点之后的结点。

(2)手动释放掉被删除结点所占用的内存。

代码如下:

程序运行结果为:

(0)

相关推荐

  • 2021年9月计算机二级公共基础知识押题11-20

    计算机二级公共基础知识考前必学系列(必考知识点系列):1.栈和队列2.树与二叉树3.软件结构图,关系代数和范式4.计算机系统下面是未来教育独家的选择题知识点讲解.[未来教育]计算机二级考前必看选择题干 ...

  • 北京理工大学-数据结构期末考试试题

    数据结构试卷(一) 一.单选题(每题 2 分,共20分) 1.    栈和队列的共同特点是(      ). A.只允许在端点处插入和删除元素 B.都是先进后出 C.都是先进先出 D.没有共同点 2. ...

  • 基本数据结构:单链表

    基本数据结构-轻松学习单链表 基本数据结构-轻松学习单链表 展开

  • 【数据结构笔记】头插法与尾插法创建单链表

    什么是头插法 首先,头指针L指向头结点,创建第一个结点并插入头结点之后.创建第二个结点插入头结点之后.--.创建第i个结点插入头结点之后.如: 头插法创建链表的代码示例: LNode *HeadCre ...

  • 算法创作 | 单链表插入问题解决方法

    问题描述 如何利用尾插法实现单链表中元素的插入? 如: 如何利用前插法实现单链表中元素的插入? 如: 解决方案 利用尾插法进行元素的插入:将需要插入的结点的前一个结点的next地址改成需要插入的结点 ...

  • 算法创作|单链表的基本操作

    问题描述 单链表是链表的一种,是一种链式存取的数据结构.用一组地址任意的存储单元存放线性表中的数据元素,链表中的数据是以结点(node)来表示的,每个结点的构成包括数据域(date)和指针域(next ...

  • 算法创作|单链表基本操作问题解决方法

    问题描述单链表:用文字描述要解决的问题是什么.用P表示head,也即是头指针,设计算法让P指向任何一个元素.示例:让P指向第n个元素.解决方案p=headfork in range(n):p=p.ne ...

  • 【数据结构笔记】线性表

    之前稍微学了一点数据结构与算法的相关知识,平时也很少用,基本上忘得差不多了.最近在学习RT-Thread(国产物联网.嵌入式实时操作系统),阅读其内核源码时发现其用到循环双链表,趁此做一下一些学习笔记 ...

  • 【数据结构笔记】顺序表——静态分配

    顺序表是线性表的一种存储结构. 什么是线性表? 线性表是一种常用的数据结构.其数据元素之间在逻辑上具有"一对一"的关系.所谓的"一对一",就是除了第一个和最后一 ...

  • 【数据结构笔记】顺序表——动态数组

    这篇写的是顺序表--动态分配.关于顺序表的具体描述可看上一篇文章写的是顺序表--静态分配. 顺序表的操作(用动态分配实现) 1.顺序表的结构定义 2.创建一个顺序表:(5,2,0,13,14) 3.查 ...

  • ​LeetCode刷题实战369:给单链表加一

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...