#数据结构#
在数据结构中,我们已经学习了后插操作的各种运用,那么不用后插操作会怎样呢?后的反义词很明显是前,那么有没有前插操作呢?前插操作又是怎样实现的呢?现在我们再来看看前插操作是怎么回事吧。
零基础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时,执行失败
同时对之后的运算,我们可以看到交换了数据域的部分,我们可以采用一个变量作为中介来进行数据的转移操作。也就是多一个媒介存储信息,相当于三元环交换位置的游戏,还请大家自行揣摩一下。
本文系作者授权百家号发表,未经许可,不得转载。