数据结构与算法(3)链表

简介: 为什么要讲链表呢?这是因为java中有很多集合类底层都是通过链表来实现的。而且面试的时候,链表的实现是经常考的一个知识点。所以这篇文章的重点在于,如何使用代码去实现这些数据结构。但是这篇文章我不打算直接上来就讲链表,而是先从线性表开始。按照惯例先给出这篇文章的大致脉络吧。首先,是对数据结构中线性表,做一个回顾。还讲了其两大存储结构,顺序存储结构和链式存储结构。接下来,重点讲各种链表的介绍,以及常用方法和特点最后,对java中使用链表的集合类,进行一个介绍。当然,还有一些常见的面试题。

一、线性表


为了很好的描述这个概念,先从一个例子开始吧,比如幼儿园的小朋友放学之后,都是手拉手排着队走出校园,这些小朋友从外表来看就像是一条链子,而线性表就和这个链子一样,这些小朋友就像是线性表里面的数据元素,从外面看一个接一个。比较正式的定义那就是:线性表:0个或者多个数据元素的有限序列。


刚刚我提到的都是从表面来看都是一样的,说明在内部的实现方式是不一样的,下面就是线性表的两种存储结构:顺序存储结构和链式存储结构。


  • 顺序存储结构:用一段地址连续的存储单元依次存储线性表的数据元素。
  • 链式存储结构:地址可以连续也可以不连续的存储单元存储数据元素


今天主要讲的就是基于链式存储结构的链表。你可以这样理解,比如说你要找一个人,名字叫张三,你首先跑到A,发现没有,A告诉你B可能知道,你跑到了B。B说C可能知道,你跑到了C,张三果然在C那里,如果没有就这样一直不停的去找。一张图看一下

v2-6675cbe3728489ca52296eb3a79e1d9a_1440w.jpg

但是这只是基础,对线性表的描述,不想花费太多时间在这。下面用一张图表述吧。

v2-42c1c641302ab8f83c88bd96d26f05ad_1440w.jpg

有了上面这张图,相信对分类等都有了了解和认识了。下面开始今天的主题单链表。

下面在对这两种存储结构进行一个对比。

v2-ab3a479cb7a0357855e606612eaa00b0_1440w.jpg


二、链表


1、单链表


对于链表,里面主要有几个重要的信息,对于每一个节点(比如上一节讲到的A,B,C三处)都有下一个节点的地址和当前节点的数据。下面代码实现一下:

首先是节点的定义(由于直接上传代码,效果不好,这里就给出图片了)):

v2-fc0b9c1144c93c96462ac7f2ded746a9_1440w.jpg

接下来无非是对节点的增删改查罢了,先看基本的操作。

v2-e9d4537be692c0f03bc851ae4fcd4b39_1440w.jpg

下面就是正删改查了,但是有一个思路需要我们要牢记,这样在使用其他语言实现的时候,就能快速的掌握,这是我自己的方法。上面已经描述了通过索引查找元素,所以下面只考虑,插入删除操作就好了。

首先,我们要判断当前的空间是否满足增删该查的条件接下来,判断增删改查的位置是否正确最后,增删改查之后没有副作用产生。


第一个操作:插入(三种方式:头插入、尾插入、中间插入)


对于插入操作,使用一张图简单表述一下

v2-d18f2e34bd2b4d5f160ad48e634bb378_1440w.jpgv2-3cde9f9508f0b5df5db4bc5b5d5473d6_1440w.jpg

v2-5809ae8f5eb1235c70fbba14cd504978_1440w.jpg

第二种操作:删除


对删除操作同样一张图

v2-2e8d63afaa2d4e03489e7e8d551ef51a_1440w.jpg

v2-1d0a32c593b141e4b6dd0321003ba0a1_1440w.jpg

小结:上述是对单链表的增删改查操作,对于其他链表关键就在于对单链表的更改。当然这里只给出了链表的代码实现。对于顺序存储结构的顺序表实现。同样也是这个道理。你只需要定义一个节点进行增删改查就好了。


2、循环链表


如果你对单链表的操作能够掌握的话,剩下的这几种链表,我相信你也能很快掌握,只不过把node中的基本数据改一下,增删的时候多一两行代码。对于循环链表,你可以想象成y一个闭环的链表。也就是最后一个元素又指向了第一个元素。其特点是这里的讨论重点。

v2-d00e6fd4bbb0c01ae7a40e49730ca3d4_1440w.jpg

特点

(1)适合合并两个循环链表:有了尾指针直接合并,比如说下面有两个循环链表。

v2-be0d8c853ba5a68b31ea5e3ffe8d496c_1440w.jpg

现在使用尾指针合并他们。

v2-b53dfd64d239bdcef0643e6baba6d747_1440w.jpg

(2)从表中任何一个节点出发,都能访问链表的全部节点。这一点很好理解。


3、双向链表


从名字就可以看出,每一个节点既指向前驱又指向后继。

v2-f9d484a9c17ccaaf21abee12d3cb7e1d_1440w.jpg

这个双向链表相对于单链表还是比较复杂的,毕竟每个节点多了一个前驱,因此对于插入和删除要格外小心。双向链表的优点在于对每个节点的相邻接点操作时候,效率会比较高。


三、java中的线性表表


最典型的就是Collection接口了。下面还包括了一些他的实现类,比如List接口,ArrayList类和LinkList类,其底层都是实现了线性表。我们只需要知道Collection这些全部都是使用了线性表,因此在遇见面试题的时候,如果要求不能使用java中提供的集合类。那么我们应该学会使用上述的线性表表的操作去解决问题。


四、常见面试题,你会几个?


对于面试题,由于篇幅问题,所以这里只给出思路,本来我把代码放进来了,但是又删除了(原谅我颤抖的手)


1、单链表的创建和遍历

本题上面已经给出答案,这里不再说了。

2、求单链表中节点的个数

这一题相当于,遍历一遍链表

3、查找单链表中的倒数第k个结点(剑指offer,题15)

先计算出链表的长度size,然后直接输出第(size-k)个节点就可以了

4、查找单链表中的中间结点

你可以先获取整个链表的长度N,N/2就好了。

5、合并两个有序的单链表,合并之后的链表依然有序【出现频率高】

这个类似于归并排序,你创建一个新链表,然后把上面两个链表依次比较,插入新链表

6、单链表的反转【出现频率最高】(剑指offer,题16)

这个是对插入操作的考察,在上面写了三种插入操作实现方式,从头到尾遍历链表,取出当前链表节点,插入新链表的头结点。这样第一个取出的节点,在新链表就是最后一个

7、从尾到头打印单链表(剑指offer,题5)

8、判断单链表是否有环


这里也是用到两个指针,如果一个链表有环,那么用一个指针去遍历,是永远走不到头的。因此,我们用两个指针去遍历:first指针每次走一步,second指针每次走两步,如果first指针和second指针相遇,说明有环。


9、取出有环链表中,环的长度

10、单链表中,取出环的起始点(剑指offer,题56)。

11、判断两个单链表相交的第一个交点(剑指offer,题37)

12、 已知一个单链表中存在环,求进入环中的第一个节点


基本上就写这么多吧,由于是基础内容,也比较容易理解,在大学的时候都学到过,这里算是一个复习巩固吧。


有什么问题,还请批评指正。谢谢



相关文章
|
存储 算法 Perl
数据结构实验之链表
本实验旨在掌握线性表中元素的前驱、后续概念及链表的建立、插入、删除等算法,并分析时间复杂度,理解链表特点。实验内容包括循环链表应用(约瑟夫回环问题)、删除单链表中重复节点及双向循环链表的设计与实现。通过编程实践,加深对链表数据结构的理解和应用能力。
295 4
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
500 30
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
726 25
|
12月前
|
存储 算法 物联网
解析局域网内控制电脑机制:基于 Go 语言链表算法的隐秘通信技术探究
数字化办公与物联网蓬勃发展的时代背景下,局域网内计算机控制已成为提升工作效率、达成设备协同管理的重要途径。无论是企业远程办公时的设备统一调度,还是智能家居系统中多设备间的联动控制,高效的数据传输与管理机制均构成实现局域网内计算机控制功能的核心要素。本文将深入探究 Go 语言中的链表数据结构,剖析其在局域网内计算机控制过程中,如何达成数据的有序存储与高效传输,并通过完整的 Go 语言代码示例展示其应用流程。
231 0
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
618 5
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
493 5
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
1491 4
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法

热门文章

最新文章