数据结构干货单链表的基本操作之插入操作

白癜风诊疗规范 http://pf.39.net/bdfyy/bdfyc/180415/6169141.html

#数据结构#

在数据结构中,我们已经学习了后插操作的各种运用,那么不用后插操作会怎样呢?后的反义词很明显是前,那么有没有前插操作呢?前插操作又是怎样实现的呢?现在我们再来看看前插操作是怎么回事吧。

零基础Python数据结构教程、源码及视频淘宝¥2购买已下架

(4)指定节点的前插操作

前插操作:将数据元素e插入到p节点之前。

在单链表中,应该如何找到p节点的前驱节点呢?

我们习惯性进行后插操作了,即先将数据元素赋给数据域,再将原先节点指针与赋予新申请的指针,在连接新元素节点到原指针后,也就是,“先给值,再从尾巴开始串珠子”。

那么,进行前插操作应该怎么办呢?

我们就先来找找指定节点前面的那个数据元素吧,在前面那个数据元素进行后插操作,不就是相当于指定节点的前插操作吗,只不过悄悄换了个对象。

那么,我们就要先循环查找到o的前驱q,再对q进行后插操作,此刻的时间复杂度为O(n).

单链表结构定义与往常一样,此处不再多加赘述。

boolinsertpriornode(LNode*p,elemtypee)

{if(p==NULL)returnfalse;//当p指针扫描为空时,执行失败

LNode*s=(LNode*)malloc(sizeof(LNode));//申请新的指针s

if(s==NULL)returnfalse;//无法分配空间,也就是内存空间不足时,分配失败

s-next=p-next;//将p指针域赋给s指针域

p-next=s;//连接s到p后,p指针域指向s

s-data=p-data;//将p数据域赋给s数据域

p-data=e;//覆盖p中数据为数据元素e

returntrue;}//执行成功

分析:我们直接找到指定数据元素,再对该数据元素的前一项进行操作,没有找前驱节点那么麻烦,运用已有的后插操作,比较快捷,可以看到无需循环操作,所用时间变短了,时间复杂度为O(1)。

我们可以看到这段代码中,有两处存在执行失败,也就是有两种执行失败的情况,我们可以用或运算,将两者合二为一。

表示如下:

if(p==NULL

s==NULL)returnfalse;  //当p指针扫描为空,或者无法申请空间定义节点s时,执行失败

同时对之后的运算,我们可以看到交换了数据域的部分,我们可以采用一个变量作为中介来进行数据的转移操作。也就是多一个媒介存储信息,相当于三元环交换位置的游戏,还请大家自行揣摩一下。

本文系作者授权百家号发表,未经许可,不得转载。




转载请注明:http://www.aierlanlan.com/cyrz/3245.html