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

[剑指offer] 18-1. 在O(1)内删除链表节点 文章目录题目思路代码 题目 给定单向链表的一个节点指针,定义一个函数在O(1)时间删除该结点。 假设链表一定存在,并且该节点一定不是尾节点。 样例 输入:链表 1->4->6->8, 删掉节点:2,第2个节点即6(头节点为第0个节点) 输出:新链表 1->4->8 注:链表题目输入的数字均表示节点的索引(由0开始),节点2也就是值为6的节点。 思路 在单链表中删除... 阅读详情

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

struct ListNode
{
    int value;
    ListNode* next;
}

void DeleteNode(ListNode* head,ListNode* pToBeDeleted);

分析

在单向链表中删除一个节点,通常的做法是从链表头开始遍历,如果某个节点的next等于要删除的节点,就将该next改为待删除节点的下一个节点,然后删除该链表节点即可。

代码如下:

void DeleteNode(ListNode* head,ListNode* pToBeDeleted)
{
    if(head==NULL || pToBeDeleted==NULL)
        return;
    ListNode* cur=head;
    if(cur==pToBeDeleted)
    {
        head=cur->next;
        delete pToBeDeleted;
        return head;
    }
    while(cur!=NULL)
    {
        if(cur->next==pToBeDeleted)
        {
            cur->next==pToBeDeleted->next;
            delete pToBeDeleted;
            return;
        }
        cur=cur->next;
    }
}

由于这样的思路需要顺序查找,时间复杂度自然就是O(n)了。

因为我们要删除某个节点,如果不是第一个节点的话,就需要更改它前面节点的next值。而单链表是无法逆行的,所以我们可以按如下步骤做:

  1. 1. 如果待删除节点不是最后一个节点,就用他的next节点的value覆盖它的value,然后删掉它的next节点。
  2. 2. 如果是最后一个节点,还是老老实实的顺序遍历吧。

But,这种方法会带来一个问题,就是可能会使原来指向待删除节点的next节点的指针在删除操作之后失效!!任何事物都是有两面性的,将删除操作时间复杂度降到了O(1),就要接受这种类似于迭代器失效问题的后果。

代码如下:

void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted)
{
    if(pListHead==NULL || *pListHead==NULL || pToBeDeleted==NULL)
        return;
    if(pToBeDeleted->next!=NULL)
    {
        ListNode* tmp=pToBeDeleted->next;
        pToBeDeleted->value=tmp->value;
        pToBeDeleted->next=tmp->next;
        delete tmp;
    }
    else
    {
        ListNode* cur=*pListHead;
        if(cur==pToBeDeleted)
        {
            *pListHead=cur->next;
            delete cur;
            return;
        }
        while(cur->next!=NULL)
        {
            if(cur->next==pToBeDeleted)
            {
                ListNode* tmp=cur->next;
                cur->next=tmp->next;
                delete tmp;
                return;
            }
            cur=cur->next;
        }
    }
}

以上

如果你有任何想法或是可以改进的地方,欢迎和我交流!

完整代码及测试用例在github上:点我前往

Latex参考文献中大写字母编译后自动变成了小写,如何保持原字母大写形式 bib文件参考文献中大写自动变为小写,如何保持原大写问题。Latex: 保持参考文献大小写,overleaf文献编译后,原大写字母自动变成了小写字母,如何保持原字母大写 阅读详情

相关推荐

SRAM Bank数量配置:性能、面积与功耗的权衡指南

SRAM(静态随机存取存储器)是芯片设计中的关键存储单元,其Bank数量配置直接影响访问延迟、吞吐率、功耗和面积。Bank切分通过将存储阵列分区,缩短位线和字线延迟,从而提升性能,但会增加外围电路开销。合理配置Bank数量可优化PPA(性能、功耗、面积),在28nm和16nm工艺下,2个Bank通常是性价比最高的选择。本文基于实测数据,探讨不同场景下的Bank配置策略,帮助工程师避免常见误区,提升设计效率。

weixin_27230891的博客 179

给定单向链表的一个节点指针,定义一个函数在O(1)时间删除该结点。假设链表一定存在,并且该节点一定不是尾节点。

*** };*/public:// 这两步的作用就是将 *(node->next) 赋值给 *node,所以可以合并成一条语句:delete p;

tesla_shy的博客 394

Matlab图像处理频域滤波实现——高斯低通、高通、带通带阻滤波器

如果你想要进一步了解更多的相关知识,

小嘤熊的博客 1万+

28. 在O(1)时间删除链表结点

给定单向链表的一个节点指针,定义一个函数在O(1)时间删除该结点。 假设链表一定存在,并且该节点一定不是尾节点。 数据范围 链表长度 [1,500]。 样例 输入:链表 1->4->6->8 删掉节点:第2个节点即6(头节点为第0个节点) 输出:新链表 1->4->8 将node->next赋给next即可 /** * Definition for singly-linked list. * struct ListNode { * .

duududuud的博客 369

银河麒麟V10ServerSP3中安装Nacos2.4.x详细教程

银河麒麟V10ServerSP3中安装Nacos2.4.x详细教程

yuanjinshenglife的专栏 1301

Petalinux 2021.2 下 Qt组件编译报错?手把手教你修改bb文件搞定qt3d/qtquickcontrols2

本文详细解析了Petalinux 2021.2环境下Qt组件(如qt3d、qtquickcontrols2)编译报错的解决方案。通过修改bb文件或使用bbappend文件覆盖,有效解决`petalinux-build --sdk`命令执行时的源码获取失败或哈希校验不匹配问题,并提供验证与调试技巧,帮助开发者快速修复构建流程中断问题。

weixin_29188997的博客 216

20190601-剑指offer18.1-AcWing-28. 在O(1)时间删除链表结点

剑指offer18-AcWing-28. 在O(1)时间删除链表结点 给定单向链表的一个节点指针,定义一个函数在O(1)时间删除该结点。 假设链表一定存在,并且该节点一定不是尾节点。 样例 输入:链表 1->4->6->8 删掉节点:第2个节点即6(头节点为第0个节点) 输出:新链表 1->4->8 思路:     先复制后一个...

WangXu__的博客 263

fMRI脑影像特征提取——Pearson相关与低阶功能连接LOFC(dpabi+nilearn)

一个连接由节点和连接强度(边)组成。功能连接中的节点可以是单个体素,也可以是由脑图谱定义的脑区ROI。通常的做法是将脑图谱中多个或者全部ROI作为节点,或者是将脑图谱中单个ROI与全脑体素作为节点。定义连接强度(边),最常用的方式是Pearson相关,两个节点之间可能没有物理连接,但如果他们的BOLD信号同步性很强,则它们之间可能存在很强的功能上的协作,即很强的功能连接,这是一个很好的表征两个节点间关系的特征。

意疏的学习笔记 2万+

剑桥offer:在O(1)时间删除链表结点

由于是单链表,我们不能找到前驱节点,所以我们不能按常规方法将该节点删除。我们可以换一种思路,将下一个节点的值复制到当前节点,然后将下一个节点删除即可。给定单向链表的一个节点指针,定义一个函数在O(1)时间删除该结点。删掉节点:第2个节点即6(头节点为第0个节点)假设链表一定存在,并且该节点一定不是尾节点。输入:链表 1->4->6->8。输出:新链表 1->4->8。链表长度 [1,500]。

weixin_53472334的博客 164

轨迹规划——带抛物线过渡的直线插补

带抛物线过渡的直线插补

doudou2weiwei的博客 1984

《UDS协议从入门到精通》系列——图解0x23:通过地址读取内存

如何读取ECU中指定内存地址的数据?图解UDS 0x23服务带你快速上手!!

车载系统攻城狮 2623

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

题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点。 该题目是经常会遇到的一种题型,但大多数人第一想到的删除节点的方法是找到节点的前一个节点,让其指向删除节点的下一个节点,然后删除该节点,但是这样做的时间复杂度是O(n),不符合面试官的要求。 分析:分成三种情况进行分析: (1)删除节点不是尾节点:找到删除节点的下一个节点next,将next节点的值赋值给删除节点

xiao1ni1zi的专栏 668

《多模态融合改进》目录一览 | 专栏介绍 :全网 第一份 完整的多模态改进教程,提供《多模态模型改进完整项目包》-开箱即用

在大家订阅专栏后,便可获得多模态模型改进完整项目包-开箱即用,方便简单

Limiiiing的博客 1万+

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

一. 题目给定单向链表的头指针和一个节点指针,定义一个函数在O(1) 时间删除该节点.代码请到我的代码库中下载 Point2Offer二. 代码package week_4;/**难度系数:*** * 剑指offer: 在O(1)时间删除链表节点 * 方法: O(1)时间,不遍历前序结点,复制覆盖 * 测试用例:功能测试(链表有多个结点/1个结点/为空/删除头结点/中间结点/尾结点) * @

高筑墙,广积粮,缓称王 694

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

在给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点。 一般思路:从头开始遍历链表,找到指定节点的前一个节点,删除指定节点,那么这样的时间复杂度是O(n). 怎么样才能做到O(1)的时间复杂度呢?我们是否必须得找到前一个节点?换一个角度,删除当前节点不容易,但是删除当前节点的下一个节点是不是和容易?我们可以将指定节点的下一个节点的值赋给当前节点,然后删除下一个节点….. ...

jingshuiliushen_zj的博客 418

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

面试题13:O(1)时间内删除链表节点

函数参数有两个:链表的头节点,需要删除的节点,两个都是ListNode*类型。一. 常规思路,复杂度为O(n)从头到尾遍历,找到该节点的前驱节点,用常规思路去设置指针。 即pre->next = deleted->next;delete deleted; 之所以要遍历,是因为是要找到被删除节点的前驱节点。二. 高效解法:O(1)方法可以用被删除节点的后继节点,去覆盖被删除节点,然后再删除后继节点

罗布泊coding 326

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

剑指Offer :面试题13 在O(1)时间删除链表节点

/* 在O(1)时间删除链表节点: 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该节点。链表结点与函数的定义如下: 关键: 找到该节点{如果该节点后面还有节点,将其值与其后面的节点交换,然后删除该节点本身           {如果该节点后面没有节点,需要找到其前面的节点,将其前面节点的指向节点指针置空 如果该节点为头节点,那么另其头节点为其后面节点的指针

qingyuanluofeng的专栏 740

剑指Offer面试题13(java版):在O(1)时间删除链表节点

题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点。 在单向链表中删除一个节点,最常规的方法无疑是从链表的头结点开始,顺序遍历查找要删除的节点,并在链表中删除该节点。 比如图a所表示的链表中,我们要删除节点i,可以从链表的头节点a开始顺序遍历,发现节点h的m_PNext指向要删除的节点i,于是我们可疑把节点h的m_PNext指向i的下一个节点即为j。指针调整之后,我

D.K专栏 4721

剑指offer之面试题13:在O(1)时间删除链表节点

题目描述给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点初始条件class ListNode{ int val; ListNode next; ListNode(int val){ this.val=val; }}思路:单向链表,删除结点,先找到该结点,从头遍历到待删除结点,时间O(n)。

sushauai的博客 364

剑指offer--面试题13:在O(1)时间删除链表节点

题目描述 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。 python实现: # Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = x # self.next = None c

qingyujean的博客 305

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

http://blog.youkuaiyun.com/jsqfengbao/article/details/47175249 转载于:https://www.cnblogs.com/Donnnnnn/p/5751277.html

weixin_33862041的博客 141

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

题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。 struct ListNode { int m_nValue; ListNode* m_pNext; }; 思路;如果按照常规方法,需要从头指针开始遍历,找到要删除的节点指针的前一个指针,使前一个指针在指向要删除结点的下一个结点,则需要时间复杂度为O(n)。 设要删除的节点指针为i,结点指针顺序为x

u012724503的专栏 287
上一篇: 面试题12:打印1到最大的n位数
下一篇: 面试题14:调整数组顺序使奇数位于偶数前面
SmartBrave
博客等级 码龄12年 25粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值