小试牛刀——单链表、双链表插入与删除

在正文开始之前,先介绍下一些相关的背景知识。


首先,什么是链表?


链表的实质是数据结构按照存储结构方式划分的一种存储结构。如下图1所示,


链表不像顺序存储结构那样,在内存中是一块连续的区域,相反,链表是“物理离散、逻辑联系”即在内存中,存储单元是不连续的、彼此之间没有顺序,但是彼此之间是通过链表中的指针链接次序联系在一起。


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


而单链表又分为了单链表、双链表和循环链表,如图3所示,




好了,下面就来详细的介绍一下单链表、双链表的插入、删除的过程。


首先来说单链表的删除:以图2为例,删除其中的a2结点。相对来说,这是一个比较简单的操作。其基本思路就是将a1中的指针域指向a3,跳过a2,然后还有一个不能忽视的操作就是释放(free)结点a2的资源。


再来说一下单链表的插入:可以效仿刚刚介绍的删除结点的思路。还是以图2为例,在a1和a2结点之间插入一个新的结点:将a1结点的指针域指向新结点,再将新结点的指针域指向a2就可以了。但是,这里需要注意的是,应该是向将新结点的指针指向a2,然后在将a1的指针指向新结点。

原因是:我们用p来表示a1结点,那么在没有进行插入之前,a2的表示方法是p->next.如果插入时,先将a1指针域指向新结点,那么p->next 代表的就是插入的新结点了,原来的结点就找不到了。解决的方法是(s表示插入的结点):将s->next赋值给p->next,然后令p->next=s,这样可以实现插入了。总结如下图,


ok,下面在来介绍一下双链表的插入、删除操作。

由图3可以看出,双链表存在这两个指针域,一个指向前一个结点,另一个指向后一个结点。这样对链表的插入和删除就要相对来说复杂了一点。

对于删除操作,思路是一样的,不同的地方只是要考虑到两个方向,这里就不再赘述了。

而插入操作,可以安装先从左至右、再从右至左来实现插入就可以。当然,要注意步骤的安排。其具体步骤如图所示:



先将新结点的前指针指向a1,再将后指针指向a2,a2前指针指向新结点,a1后指针指向新结点。


总结:其实单链表和双链表的插入和删除的基本思想是一致的。只是在细微处有一些差异。对于这些操作,用语言来描述不是太让人容易理解,但是文章的插图可以帮助我们很好的理解,一张图胜过千言万语。

你可能感兴趣的:(技术类,存储,数据结构,语言)