C语言学习日记 单链表2

单链表删除最小值算法。

首先学习一个算法之前,我觉得必须弄清楚算法的思想,知道它是如何去运作的,都主要分为那些步骤,特别是像递归这种重复性比较强的一些步骤操作。

算法一

在这里插入图片描述
在确定好大致的框架之后,就可以具体的落实代码了
首先定义函数以及它的相关的参数
在这里插入图片描述
这里之所以要将函数返回值定义为 LinkList型的结构指针是因为,下一步想要将修改后的链表输出出来,下面是具体代码实现
LinkList Del_X(LinkList L, ElemType X)
{
LinkList q = L;//记录链表开始的首地址
if (L->next == NULL)//链表为空,什么也不做
{
return L;
}
else if (L->next->data == X)//头节点无数据,所以跳过头节点
{
LinkList p;
p = L->next;//p指向该节点地址
L->next = p->next;
free§;
Del_X(L->next, X);
}
else
{
Del_X(L->next,X);
}
return q;
}

算法的时空分析,由于递归需要借助栈来暂存函数递归的结果,所以空间复杂度为O(n),链表找到对应X值后仍然要递归至链尾,所以它的时间复杂度也为O(n)。

算法二

实现删除单链表中元素值最小的节点(假设最小值唯一)
大致的思路
要想找到最小值必须要遍历链表并且进行比较,同时为了能够快捷的删除该节点则需要记录该节点的位置以及其直接前驱节点
LinkList Del_Min(LinkList L)
{
LinkList min,premin,p,pre;
p = L->next;
premin = p;//初始化记录第一个节点为最小值点
pre = p;
min = p;
while (p!=NULL)
{
if (p->datadata)
{
premin = pre; //更新前驱节点指针
min = p;//更新最小值指针
}
pre = p;//记录前驱节点位置
p = p->next;
}
premin->next = min->next; //删除最小值节点
free(min);
return L;
}

算法时空复杂度分析,链表一次遍历所以时间复杂度为O(n),定义了两个指针分指向两个节点,所以空间复杂度为O(1);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值