用O(1)的时间复杂度删除单链表中的某个节点

O(1)的时间复杂度下删除单链表中的节点 1,基本思路 在单链表中如果要删除一个节点,需要通过头结点找到该节点的前驱节点,然后让该节点的前驱节点指向它的后继节点,然后free点当前节点就实现了单链表的删除,但是这样的删除需要遍历到当前节点的前驱节点,时间复杂度自然而然就成了O(n),那么如何O(1)删除呢? 如果想要O(1)删除节点,就不能删除当前节点,因为不知道当前节点的前驱节点,删除最后单链表的链... 阅读详情

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

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */

函数的声明如下:

void DeleteNode(ListNode pListHead, ListNode pToBeDeleted)

一般单链表删除某个节点,需要知道删除节点的前一个节点,则需要O(n)的遍历时间,显然常规思路是不行的。在仔细看题目,换一种思路,既然不能在O(1)得到删除节点的前一个元素,但我们可以轻松得到后一个元素,这样,我们何不把后一个元素赋值给待删除节点,这样也就相当于是删除了当前元素。可见,该方法可行,但如果待删除节点为最后一个节点,则不能按照以上思路,没有办法,只能按照常规方法遍历,时间复杂度为O(n),是不是不符合题目要求呢?可能很多人在这就会怀疑自己的思考,从而放弃这种思路,最后可能放弃这道题,这就是这道面试题有意思的地方,虽看简单,但是考察了大家的分析判断能力,是否拥有强大的心理,充分自信。其实我们分析一下,仍然是满足题目要求的,如果删除节点为前面的n-1个节点,则时间复杂度为O(1),只有删除节点为最后一个时,时间复杂度才为O(n),所以平均的时间复杂度为:(O(1) * (n-1) + O(n))/n = O(1);仍然为O(1).下面见代码:

  /* Delete a node in a list with O(1)
   * input:    pListHead - the head of list
   *            pToBeDeleted - the node to be deleted
   */

 void DeleteNode(ListNode pListHead, ListNode pToBeDeleted)
 {
     if (pListHead == null || pToBeDeleted == null)
        return;

    if (pToBeDeleted.next != null) {
        ListNode pNext = pToBeDeleted.next;
        pToBeDeleted.next = pNext.next;
        pToBeDeleted.val= pNext.val;
     }
     else { //待删除节点为尾节点
         ListNode pTemp = pListHead;
         while(pTemp.next != pToBeDeleted)
             pTemp = pTemp.next;
         pTemp.next = null;
     }
 }
单链表中实现O(1)时间复杂度删除节点 单链表中实现O(1)时间复杂度删除节点链表节点struct LinkNode { datatype data; LinkNode* next; }当删除单链表中某个节点时,最容易想到的方法是:首先找到待删节点p的前一个节点q,利用这个前驱节点指针域的值,来确定p的位置。然后使用下面的语句删除节点p。p=p->next;但这种方法因为需要找到p的前驱节点,遍历时间复杂度O(n)。这里介 阅读详情

相关推荐

一文讲透什么是ADC/DAC中的DDC、DUC、采样率以及数据率等概念

摘要:ADC/DAC中的采样率与数据率概念不同,采样率是转换器的时钟速率,而数据率是数字输出的实际速率。抽取通过滤波降低数据速率,提升信噪比但牺牲带宽;内插则通过插零和滤波提高采样率,将镜像信号移远但增加延迟和功耗。JESD204B标准的高速转换器需平衡通道数与串行速率,内插/抽取技术是关键。文章还解析了DDC、DUC的应用及优缺点,为高速数据转换设计提供参考。(150字)

weixin_49761275的博客 4266

单链表--给定一个链表,删除指定节点,O(1)时间复杂度删除指定节点

目的:在给定一个链表,删除指定的节点,让其时间复杂度为O(1) 实现思路:让给定节点node的下一个节点p的value赋值给node,再让p=node的next的next。 这种方法,当待删除节点为最后一个节点时,该方法就出错了,就使用遍历的方法来删除。删除最后一个节点的时间复杂度为O(n),但是前面n-1和节点删除的时间复杂度为O(1),总体来看,这种方法满足条件,使时间复杂度为O(1)。 ...

weixin_47311994的博客 2243

LPDDR5/5X BG mode,8B mode和16B mode

LPDDR5/5X 器件,协议上支持多个bank架构可静态配置;配置在MR3:模式说明协议要求速率要求BLBG模式每CH 4BG, 4BALPDDR5/5X>3200MbpsBL16 & 328B模式每CH 8BALPDDR5任何速率BL3216B模式每CH 16BALPDDR5/5X<=3200MbpsBL16 & 32。

hemlok的博客 8859

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

题目: 给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点。链表节点定义如下: public class ListNode { public int val; public ListNode next; } 分析: 有三种情况: 要删除的节点不是尾节点,时间复杂度为O(1)。 单链表中只有一个节点,删除头节点,时间复杂度为O(1)。 单链...

qq_32100465的博客 1394

libjpeg-turbo图片解码 VS opencv

本文对比了libjpeg-turbo和opencv在图像解码层面的耗时情况,及解码数据是否存在diff

优快云_WHB的博客 833

TI IWR6843AOP雷达+DCA1000EVM数据采集:官方手册里的坑,我帮你踩完了

本文详细解析了TI IWR6843AOP雷达与DCA1000EVM数据采集实战中的12个关键细节,包括硬件连接陷阱、mmWave Studio隐藏设置、数据采集参数优化等,帮助开发者避开官方手册未提及的常见问题,提升数据采集效率和系统稳定性。

weixin_28366475的博客 1102

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

一个编程练习,删除单链表一个节点,且时间复杂度控制在O(1)内. 1.核心操作代码如下: struct ListNode { int m_data; ListNode *m_pNext; }; void DeleteNode(ListNode **pListHead, ListNode *pToBeDeleted) { if(pListH...

948

深入解读ES8388寄存器:从录音到播放,如何用代码控制这颗音频Codec

本文深入解析ES8388音频编解码器的寄存器设置,从录音到播放的完整控制流程。详细介绍了寄存器架构、录音通道配置、播放通道优化以及直通(Bypass)模式的高级应用,帮助开发者通过代码精准控制这颗高性能音频Codec,解决实际开发中的音质问题。

weixin_30275415的博客 548

每日一算: 在时间复杂度O(1)下删除单链表中节点

背景 今天做到一道题:设一个有序的单链表中有n个节点,现要求插入一个新节点后是的单链表仍保持有序,则该操作的时间为:。 答案是:O(n) 为什么? 因为它是链表! 链表的增删改功能,一定依托于其“low的一批”的“ 遍历 ”,这是链表的核心。插入一个数据,就要遍历一遍,有n个节点,时间复杂度就是O(n)。 冰火两重天:时空复杂度O() 这一部分我自认为没有能力讲解清楚,相比自己,我更想为大家推荐一...

flying meng的菜鸟居 3664

机器学习实战5-天气预测系列:利用数据集可视化分析数据,并预测某个城市的天气情况

大家好,我是微学AI,最近天气真的是多变啊,忽冷忽热,今天再次给大家带来天气的话题,机器学习实战5-天气预测系列,我们将探讨一个城市的气象数据集,并利用机器学习来预测该城市的天气状况。该数据集包含年平均温度和湿度等信息。

微学AI的博客 1万+

5、自适应 RBF 神经网络控制方法解析

本文详细解析了基于RBF神经网络的多种自适应控制方法,包括针对函数未知、参数未知以及存在外部干扰的非线性系统的控制策略。通过李雅普诺夫稳定性理论设计自适应律,确保闭环系统稳定,并结合仿真示例和MATLAB代码实现,展示了方法的有效性。文章还对比了不同控制方法的适用场景,并给出了实际应用流程,为复杂系统控制提供了系统性解决方案。

ol789012的博客 71

剑指Offer13:o(1)时间复杂度下删除单链表某一节点

o(1)时间复杂度下删除单链表节点问题 题目描述 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。 问题分析 如果我们想要删除结点i,可以从链表的头结点a开始遍历,发现结点h的m_pNext指向要删除的结点i,于是我们可以把结点h的m_pNext指向i的下一个节点j指针调整后,我们就可以安全的删除结点i,并保证链表没有断开。但是这种思路的时间复杂度为o(n). 也可以先将...

bruce_xia6116的博客 209

把 SM30 用顺:从表设计到权限与传输,全面掌握 SAP Table Maintenance Generator

摘要 SAP的Table Maintenance Generator(TMG)是为配置表维护需求设计的经典工具,能够生成标准化的维护对话框(SM30)。它支持单表、维护视图(多表关联)和视图簇(导航式维护)三种维护对象类型。使用TMG前需注意三个关键设置:1)表维护权限选项;2)交付类(决定数据传输行为);3)客户端字段配置。通过SE54/SE11生成维护对话框时,需选择维护类型(一步/两步)和记录例程(控制传输)。TMG生成的对象包含函数组、屏幕和处理模块,但部分标准框架不可修改。实际应用中,可通过参数事

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 176

数据结构:删除单链表中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) +

WangGarrison的博客 3287

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

删除单链上数据域值最小的节点_图解:单链表删除,不遍历链表也能做(时间复杂度O(1))...

在开始这个问题之前,先想想,如果给定单链表中的某个结点,如何在单链表中删除该节点?对于一个单链表,它每个结点的数据结构除了存储自身的数据之外,还需要记录链表上,下一个结点的地址,通常我们将这个地址称之为后续指针 next。那如上图所示,我想删除其中的 C 结点,需要做什么操作?很简单,将 B 结点的后续指针 next 指向 D 结点即可。此处应该清晰了,要删除链表上的某个结点,我们需要知...

weixin_39895167的博客 143

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

面试题13:在O(1)时间删除单链表结点

题目:给定单链表的头指针和一个结点指针,定义一个函数在O(1)时间删除节点。 一般思路 从头开始顺序遍历单链表,遇到要删除的节点跳过去就行了 O(1)思路 因为已经给了要删除节点的指针,可以找到待删除节点的写一个节点的值,复制到待删除节点,将该节点的next指针指向next.next就行了,流程如下: (1) a->b->c->d->e 要删除的是c节点 (2) a->b->d

chixujohnny 1557

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

[面试题]单链表:如何在O(1)的时间复杂度下删除指定节点?

问题描述: 对于一个如下所示的单链表,存在Head指针指向链表头,另外有一个Ptr指针指向链表中的任意节点。现在要求在O(1)的时间复杂度下删除Ptr指针所指向的节点。 问题分析: 正常的思路是:要删除Ptr指向的D节点,我们需要找到指向D节点的C节点。要找到C节点,我们需要遍历整个链表,时间复杂度是O(1)。 正确的思路是:我们可以很快找到D节点所指向的下一个节点:E节点,而且...

梦回南柯的博客 925

单链表删除节点时间复杂度O(1):算法实现

王道书上的代码: q=p->next; p->data=p->next->data; p->next=q->next; free(q); 如果删除的元素没有后继元素,那么代码会出现问题,即没有办法真正的删除这个元素。 我的理解是这样的,上个元素指向的地址是不变的永远都指向这一块,所以当前元素你不论是设为NULL还是free掉,都没有用 所以我引入了一个新的参数将链表传过去,找到该元素的前驱元素,从而通过修改前驱元素的指针来达到删除的目的; 修正后的代码 int De

qq_46159283的博客 1852

LintCode解题笔记 - 在O(1)时间复杂度删除链表节点

给定一个单链表中的表头和一个等待被删除的节点(非表头或表尾)。请在在O(1)时间复杂度删除该链表节点。并在删除该节点后,返回表头。原文链接: http://www.lintcode.com/zh-cn/problem/delete-node-in-the-middle-of-singly-linked-list/思路,传统意义上,删除当前节点是从头结点head遍历,匹配到目标节点后删除,但是时间复杂

xiewenjiang110的博客 1983
上一篇: 349. Intersection of Two Arrays
下一篇: 实现一堆栈,要求三个操作,Pop,Push,GetMaxValue,时间均为O(1)
sipherhern
博客等级 码龄11年 2粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值