在时间复杂度O(1)内删除单链表节点

这篇博客讨论了如何在O(1)时间内删除单链表中的节点。根据节点位置,分为删除非尾节点、删除头节点和删除尾节点三种情况。对于非尾节点和头节点,可以立即完成删除操作。而对于尾节点,需要遍历链表,时间复杂度为O(n)。尽管如此,算法的平均时间复杂度仍然是O(1)。文章还提供了实现这一操作的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点。链表节点定义如下:

public class ListNode {
     public int val;
     public ListNode next;
}

分析:

有三种情况:

  1. 要删除的节点不是尾节点,时间复杂度为O(1)。
  2. 单链表中只有一个节点,删除头节点,时间复杂度为O(1)。
  3. 单链表中有多个节点,要删除的为尾节点,时间复杂度为O(n)。

针对第一种情况,采用如下步骤进行删除。

  1.  找到该节点的下一个节点。
  2. 将下一个节点的值赋给该节点。
  3. 让该节点的后继指向下一个节点的后继。

针对第二种情况,直接置空即可。

针对第三种情况,需要整个链表进行遍历,所以时间复杂度是O(n)。

分析一下这个算法的平均时间复杂度。对于n - 1个非尾节点而言,我们可以在O(1)时间内把下一个节点的内存复制覆盖要删除的节点,标红删除下一个节点;对于尾节点而言,由于仍然需要顺序查找,时间复杂度是O(n)。因此,总的平均时间复杂度为[(n - 1) * O(1) +  O(n)] / n,结果还是O(1)。

代码:

public class DeleteNode {
    //单链表的结构
    publ
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值