浅谈二刷链表的感受以及引发的思考

1.总括

链表这个东西,就是一个非连续的物理结构,也属于这个线性表的一种,但是不像顺序表那样在这个物理结构上面是连续的,因此我们没有办法通过下标对于这个链表进行遍历,而是需要一个next指针进行这个指向的说明;

链表是有很多个节点组成的,每一个节点有两个部分组成,一个就是data,也就是这个节点对应的数据,还有一个就是next指针,用来指向下一个节点,通过这个指针来找到下一个节点,无数个这样的节点组成了链表;

链表划分为这个单链表和双链表,我们前期进行模拟实现的功能,就是针对于这个单链表而言的,毫无疑问,这个单链表就是只有一条链,双链表就是有两条链,我们后期也会进行相应的了解,但是我目前觉得还是这个点链表使用的多一些;

2.为什么要学习链表

(1)我们前面已经实现了这个顺序表,顺序表和链表的功能基本上就是一样的,思路也差不多,为啥呢么要学习链表呢?

(2)在我这个初学者看起来,要想知道原因,首先要从这两者的结构入手去分析,这个顺序表就是有这个数组,数据的个数,以及这个容量三个部分组成的,而且我们学习的还是动态的顺序表,可以进行这个扩容,好像也是很方便的,空间够就对应操作,空间不够就扩容;

(3)但是有一点就是这个顺序表在中间插入数据的时候需要进行这个挪动,挪动的话这个需要从挪动的位置开始挨个的进行遍历,这个就显得很浪费时间,但是这个链表的优势就会凸显出来,因为这个链表不是连续的,因此这个我们只需要把插入位置的前一个指针指向插入的数据,插入数据的指针指向插入位置的下一个数据,这个只需要改变前后两个节点的指针的指向就可以很高效的解决这个问题;

(4)虽然表面上看,这个链表插入数据的时候,改变一下这个节点的指针指向就可以了,但是实际操作起来并非易事,因为这个很考验我们对于这个指针的理解和运用,尤其是尾插,头插数据的时候,还要用到二级指针,这个让一些同学更是望而生畏,何况这个二级指针是我们通过调试才可以发现这个问题,第一次写的时候很难会想到,指针之间的赋值,指向等等这些对于我们都是不小的考验;

(5)相比之下,这个顺序表就和蔼了很多,因为这个顺序表是使用数组,我们需要使用循环结构,这个只要我们进行认真的分析,结束条件,循环语句也不是很困难写出,这个就相比指针降低了门槛,而且,使用链表里面的指针会出现这个空指针,野指针的问题,这些都对于我们提出了严格的要求;

(6)但是,链表作为这个数据结构,我们还是必须好好掌握的,事虽难,做则必成,我也是一遍一遍的学习走过来的,我在第一遍学习的时候也是感觉这个真的好难好难,但是只要我们多学几遍,我认为还是可以拿下的,就看我们有没有这个毅力了,大学计算机,想要高薪(可能有些功利化,但是这个也是计算机分数线久高不下的原因吧),就必须克服这些困难,其实这些也不是困难,因为我相信一句话:只要是学习能够解决的问题,就不是什么困难;

其实很多时候,我们只是在这个学校里面学习知识,如果我们不练就自己的本事,很难想象我们在工作的时候的场景,我坚信只有自己强大,技术过硬,才可以有选择的底气;

(7)还有一点需要我们注意的就是这个顺序表需要动态的开辟空间,因此这个使用的函数是realloc函数,这个函数可以进行增容,但是对于这个链表,例如这个在头插的时候,肯定也要开辟新的节点,这个时候我们只需要使用malloc函数就可以了,因为这个不涉及到动态增容的问题;

3.链表的诸多功能实现

(1)其实这个链表的功能实现,无非就是增删查改数据,和顺序表没有什么区别,但是因为是使用的指针,所以可能在这个操作上面会有所区别,但是这个大体的思路是肯定不会变的;

(2)我们还是需要定义这个相关的函数,例如这个链表的打印,链表的头插,尾插,头删,尾删,为了方便我们的查看效果,我们还可以定义一个打印的相关函数;

(3)首先应该是实现的尾部插入数据,这个时候肯定是要开辟出一个新的节点,把这个数据存到这个节点里面去,原来我们的最后一个节点指向的是空的,现在我们需要让这个节点指向这个新的节点,然后让这个新的节点指向null指针;

这个还需要考虑这个链表本身是不是空的,如果是空的,我们直接把这个新的节点作为头结点就可以了,如果不是空的,我们还需要使用循环找到最后一个节点,然后进行相关的操作;

(4)头部插入数据相比较而言就会比较简单,因为我们只需要开辟新的节点空间,让这个新的节点的指针指向原来的头结点,然后再让这个新的插入节点成为头结点;

(5)尾删数据节点也是比较复杂的,因为这个时候需要定义两个指针,例如有12345这五个节点吧,我们想要删除5这个节点,这个时候我们就需要先找到这个5节点,还要标记一下4这个节点,删除5节点,把这个4节点指向空指针,这个时候我们必须要记录一下最后一个节点前面的节点位置,方便我们把这个节点作为新的尾节点;

但是对于一个没有很多节点的链表,我们就不需要标记前面的节点了,因为就不存在,这个只有一个tail节点,没有prev节点,我们直接删除这个节点就可以了,然后置为空;

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值