数据结构:删除单链表中p节点,时间复杂度O(1)

题目背景

在plist中删除p节点,时间复杂度要求O(1)

算法

因为时间复杂度为O(1),所以常规思路遍历链表是不行的。删除节点,其实是把该节点数据域清除,已知了p节点,那么可以知道它的next节点,所以可以把p节点的下一个节点的数据域赋值给p节点数据域,再让p节点的next指向p->next->next,就实现了p节点数据域的清除,也就间接删除了p节点。
如果p是最后一个节点,则只好遍历链表,复杂度O(n)
只有p是最后一个节点时间复杂度才是O(n),平均时间复杂度(O(1)*(n-1) + O(n))/n = O(1),所以该算法时间复杂度仍为O(1)

C代码

bool DeleteP(Linklist plist, Linklist p)//在plist中删除p节点,O(1)
{
	assert(plist != NULL);
	assert(p != NULL);
	if (plist == NULL || p == NULL)	
		return false;
	if (p->next != NULL)//p不是最后一个节点
	{
		//把p->next->data的值赋值给p->data,再让p->next指向下下个节点
		p->data = p->next->data;
		p->next = p->next->next;
		free(p->next);
		return true;
	}
	else//p是最后一个节点
	{
		LinkList tmp;
		for (; tmp->next->next != NULL;)
		{
			tmp = tmp->next;
		}
		tmp->next = NULL;
		free(tmp->next->next);
		return true;
	}
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值