快速入门双链表(上)

  1. 温习链表类型

  1. 初始化链表

  1. 实现接口:

  • 尾插

  • 头插

  • 头删

  • 尾删

  • 查找

  • 打印

  • 任意插入,在pos的前面插入x

  • 任意删除,删除pos位置的值

  • 释放空间

温习链表类型

首先我们来了解链表的几种类型。

我们之前写过顺序表单链表,感兴趣的可以看一下这两篇文章。了解完这两篇文章后我们对链表就有了初步的理解,以便于我们挑战的链表最复杂的结构——双向带头循环链表。

为了便于学习我们先复习一下顺序表和单链表的基本结构。

顺序表的图解

单链表的图解

链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表

中的指针链接次序实现的。

而顺序表物理上的结构它是连续的。这是它们形式上的最大区别了,当然还有浪费空间,查找时的时间复杂度为O(N)等等。

我们今天探讨的双链表又和之前学习的单链表又有么不同呢?

我们之前学习的单链表的时候时常苦恼要用双指针结构去查找值,后者说不能找到前一个值,所以我们的实现逻辑上就很复杂。

那么我们现在要学习的双链表又有什么不同呢?

对双链表有了比较直观的理解后我们来深入学习

初始化链表

这里我建议大家要学会创建工程文件,还不会的小伙伴可以看一下这篇文章——

顺序表(一)

  • List.h头文件——声明函数

  • List.c——函数实现

  • test.c——主函数

创建完成以后我们可以更方便的对程序后期的修改

接着我们在头文件中写入:

这里我们可以对照学习——单链表(一),这里的思想和套路是相近的。

再到List.c中写入:

实现接口:

接下来进行接口实现。这一步是为了完善链表结构,实现双链表的功能,当然这也是我们对双链表学些的重中之重。

尾插

为了有个直观的印象,我们首先尝试着把原理图先画一下

尾插的原理图

这里要注意的是,有些书上讲头节点/哨兵位要放入数据大小,这其实很不科学。比如:我们放入的数据类型是一个结构体那么所谓的哨兵位储存的大小又该怎么算呢?所以我们在这里最好不要储存任何东西,我们就把头节点看成一个锚点就行了。

我们始终要思考图示里的头插是所有情况的代表吗?

我们运用单链表(三)里头的套路,思考极限情况。没有数据时可以吗?

我们再来画一个图解

没有数据的情况下进行尾插

其实不管有没有数据其实时一样的。

接下来我们将思想转换为代码

接下来我们实现头插

头插

还是老套路我们首先画一下图解

头插图解

了解原理图将它转换为代码就简单了

这里有一下注意点:

  1. assert不能少

  1. 写的顺序问题

    • assert不能少

当我们传入空指针进去的时候,头节点本质上不存在,那么这个双链表的基本结构就不存在了,所以一定不能传空指针!

    • 写的顺序问题

用我的代码是没有问题的,因为我保存了原来第一个节点的地址——first。但是如果这样表达就要考虑能不能找到first了——phead->next->prev = newnode。

诚然两种写法都行,但是我的这种方法就不需要考虑写的顺序问题了。

时间原因,我把双链表分成上下两期来探讨,还请谅解。

都看到这了不妨点个赞吧!

等我更新了双链表(下)以后我会把链接放到评论区,感兴趣的小伙伴自取哦!

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

染柒_GRQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值