剑指Offer(第二版)面试题18:删除链表的节点

《剑指offer》Java版 一、引言 《剑指offer》可谓是程序猿面试的神书了,在面试中帮了我很多,大部分面试的算法题都会遇到原题或者是类似的题。但是书上的代码都是C版的,我在这里整理了一份Java版的代码供大家学习参考,这些代码我都是在OJ上跑过全AC的,所以正确性你大可放心。 二、目录 1赋值运算函数 2单例设计模式 3二维数组中查找目标值 4替换字符串中的空格 5从尾到头打印链表 6由前序和中序遍历重建二叉树 7用两... 阅读详情

面试题18:删除链表的节点

问题

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

void DeleteNode(Node** pListHead, Node* pToBeDeleted);

思路

如果我们把下一个节点的内容复制到需要删除的节点上覆盖原有的内容,再把下一个节点删除,就OK了。
总的复杂度是[(n-1)*O(1)+O(n)]/n。

注意

  • 删除的节点在链表的尾部的情况。
  • 只有一个头节点的情况。
  • 因为可能会删除头结点,所以传入指向指针的指针。

参考代码

#include <iostream>

using namespace std;

struct Node
{
    int val;
    Node* next;
    Node(int i,Node* next = nullptr):val(i),next(next){ }
};

void show(Node** pListHead);
void DeleteNode(Node** pListHead, Node* pToBeDeleted);

int main()
{
    int input = 0;
    cin >> input;
    while(input != -1)
    {
        Node* n1 = new Node(1);
        Node* n2 = new Node(2);
        Node* n3 = new Node(3);
        Node** head = &n1;
        n1->next = n2;
        n2->next = n3;
        if(input == 1)
            DeleteNode(head,n1);
        if(input == 2)
            DeleteNode(head,n2);
        if(input == 3)
            DeleteNode(head,n3);
        show(head);
        cin >> input;
    }
    return 0;
}

void show(Node** pListHead)
{
    Node* node = *pListHead;
    while(node)
    {
        cout<<node->val;
        node=node->next;
    }
    cout<<endl;
    return;
}

void DeleteNode(Node** pListHead, Node* pToBeDeleted)
{
    if(pListHead == nullptr || pToBeDeleted == nullptr)
        return;

    if(pToBeDeleted->next != nullptr)
    {
        Node* pNext = pToBeDeleted->next;
        pToBeDeleted->val = pNext->val;
        pToBeDeleted->next = pNext->next;
        delete pNext;
        pNext = nullptr; 
    }
    else if(*pListHead == pToBeDeleted)
    {
        delete pToBeDeleted;
        pToBeDeleted = nullptr;
        *pListHead = nullptr;
    }
    else
    {
        Node* pNode = *pListHead;
        while(pNode->next != pToBeDeleted)
            pNode = pNode->next;
        pNode->next = nullptr;
        delete pToBeDeleted;
        pToBeDeleted = nullptr;
    }

    return;
}
无网环境也能玩转DBeaver?手把手教你离线安装与ClickHouse连接(附实测jar包) 本文详细介绍了在无网环境下如何离线安装DBeaver并配置ClickHouse连接的完整指南。通过准备必备工具如DBeaver安装包、ClickHouse JDBC驱动及Maven本地仓库,确保在物理隔离环境中实现数据库管理。文章包含详细的安装步骤、驱动配置和性能优化建议,帮助开发者在严格网络限制下高效工作。 阅读详情

相关推荐

论文分享 - OctoMap八叉树建图原理

论文:OctoMap:An Efficient Probabilistic 3D Mapping Framework Based on Octrees。

一只废佐_的博客 2539

剑指offer第二版——面试题18(java)

面试题18:删除链表的节点 题目一 :在O(1)时间内删除链表节点——见【LeetCode 237. Delete Node in a Linked List & 剑指offer Q18】 题目二:删除链表中重复的节点 题目描述: 在一个排序的链表中,如何删除重复的节点 如1→2→3→3→4→4→5 删除重复节点,重复节点不保留之后得到:1→2→5 分为三个部分: ① 删除...

冲鸭!!! 326

SAP成本中心费用分割(KSS2)实战:从原理到月末调整全解析

本文详细解析了SAP成本中心费用分割(KSS2)的核心逻辑与实战操作,从成本要素分组配置到月末调整全流程。通过KSS2将初级成本要素按作业类型重新分类为次级成本要素,确保成本结算准确。文章还提供了常见错误处理方法和典型业务场景实战,帮助用户高效完成SAP成本结算。

weixin_29279101的博客 1254

算法题目-删除链表中等于给定值val的所有节点

题目:删除链表中等于给定值val的所有节点 给出链表 1->2->3->3->4->5->3, 和 val = 3, 你需要返回删除3之后的链表:1->2->4->5。 分析思路:这道题的思路,与之前删除链表中重复的结点相似。 因为头结点可能被删除,因此解题的关键在于,创建一个虚结点,将虚结点的next指向原本的头结点。 /** * Definition for singly

可可 2685

IAR9.X半主模式异常解析:为何硬件复位后仍陷调试状态?

本文深入解析了IAR 9.X半主模式异常问题,探讨了硬件复位后MCU仍陷调试状态的原因及解决方案。通过分析半主模式工作机制,提供了禁用半主功能、重写低级IO函数等具体方法,并给出了版本兼容性处理和调试与量产配置分离的优化建议,帮助开发者有效解决复位异常问题。

oo7890的博客 604

PCL点云DBSCAN聚类算法:基于密度的点云聚类

核心点是在给定半径内拥有足够多邻居点的点,边界点是在给定半径内没有足够多邻居点但是位于核心点的邻域内的点,噪声点是既不是核心点也不是边界点的点。本文将介绍PCL中的DBSCAN(基于密度的空间聚类应用噪声)算法,用于点云数据的聚类。上述示例代码首先从PCD文件中读取点云数据,并设置了DBSCAN聚类的参数,包括邻域搜索半径(epsilon)和邻域内最小点数(min_points)。需要注意的是,示例代码中的点云数据格式为pcl::PointXYZ,如果使用其他类型的点云数据,需要相应地修改代码。

LpmShell的博客 1237

《剑指offer》面试题18:删除链表的节点(扩展)

更多剑指offer习题请点击:《剑指offer》(第二版)题集目录索引 1. 题目一:在 O(1)O(1)O(1) 时间内删除链表节点   给定单向链表的头指针和一个节点指针,定义一个函数在 O(1)O(1)O(1) 时间内删除该节点。链表节点与函数定义如下: typedef struct ListNode { int m_nValue; struct ListNod...

Tianzez的博客 727

Unity 工具 之 SoftMask软遮罩 实现 UI 边缘渐变过渡的简单使用介绍

目录Unity 工具 之 SoftMask软遮罩 实现 UI 边缘渐变过渡的简单使用介绍一、简单介绍二、Mask 实现的遮罩效果三、Soft Mask 实现遮罩效果四、 Soft Mask 的一些设置五、插件下载Unity 工具类,自己整理的一些游戏开发可能用到的模块,单独独立使用,方便游戏开发。

仙魁XAN 8573

【剑指offer❤️】18.删除链表节点

题目一:在O(1)时间删除链表结点 给定单向链表的一个节点指针,定义一个函数在O(1)时间删除该结点。 假设链表一定存在,并且该节点一定不是尾节点。 JAVA /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNo...

codeDonald的博客 223

AI大模型探索之路-训练篇3:大语言模型全景解读

大规模语言模型(Large Language Models,LLM),也称大语言模型或大型语言模型,是一种由包含数百亿以上参数的深度神经网络构建的语言模型,通常使用自监督学习方法通过大量无标注文本进行训练。

寻道AI,探索AI无限可能! 6270

2026.02.04 AI趋势|原生工作流爆发,智能体重构开发范式

2026年2月4日GitHub Trending榜单迎来关键转变——传统工具链项目占比骤降,AI原生工作流相关项目成为绝对主流。本次Top 20榜单中,超70%项目聚焦AI模型的四大核心能力:上下文增强、任务编排、自治执行、知识闭环。值得关注的是,Claude生态(如claude-mem)与OpenAIskills框架形成跨厂商协同,尽管设计理念有差异,但共同推动多模型智能体(Multi-Model Agent)成为新一代软件基础设施,AI开发正式从“单点调用”迈入“系统级编排”时代。

lpfasd123的博客 342

删除链表的节点,关于delete和free

最近温习链表的知识,看到《C++入门经典》,第九版,P528。 这里面讲解了链表的删除节点。 delete nodeToDelete; 用这样一句话就删除节点了,十分方便。 不过,我还是有些疑问,这是不是太简单了。然后就查询了一下,果然有学习到了一个知识点,我已经会的,忘记了,这次又学一遍,应该不会忘记了。 ############################

奋斗,永不止步 9017

TIA protal与SCL从入门到精通(4)——软件单元使用

平台: TIA portal 15.1 1.添加软件单元 添加软件单元如下图: 关于软件单元使用基本限制,看如下文章即可 TIA protal与SCL从入门到精通(3)——软件单元基本介绍 每个软件单元是一个独立结构,所以每个软件单元的运行方式与实际PLC类似,所以首先添加主函数块: 注意:无论系统是否是具有并发性(这里不要混淆并行与并发的概念),在PLC所有主函数执行总是按主函数依次完成...

苦走一口田 7375

《剑指Offer(第二版)》面试题18. 删除链表的节点

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。 返回删除后的链表的头节点。 注意:此题对比原题有改动 示例 1: 输入: head = [4,5,1,9], val = 5 输出: [4,1,9] 解释: 给定你链表中值为5的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9. 示例 2: 输入: head = [4,5,1,9...

今晚打老虎 178

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

IEM模型,地表粗糙度模拟

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

剑指offer第二版(Python3)--面试题18:删除链表中重复的节点

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。

鲁班七号 446

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

大神整理的剑指Offer【所有面试题汇总】

    剑指Offer学习   剑指Offer这本书已经学习完了,从中也学习到了不少的东西,现在做一个总的目录,供自已和大家一起参考,学如逆水行舟,不进则退。只有不断地学习才能跟上时候,跟得上技术的潮流! 所有代码下载【https://github.com/Wang-Jun-Chao/coding-interviews】 目录 第01-10题 【剑指Offer学习】【面试题02:...

晓飛的博客 3万+

蓝牙模块HM-10手册

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

剑指Offer Leetcode 面试题18. 删除链表的节点

剑指Offer Leetcode 面试题18. 删除链表的节点

TrueDei 1311

【剑指offer】 面试题18 删除链表中的重复节点

题目描述 在一个排序的链表中,如何删除重复的节点?例如,1-2-3-3-4-4-5删除之后变成了1-2-5 解题思路 解题的关键是 1.如何判断节点是重复的? 在一个已排好序的链表中,我们只需要判断相邻的两个节点的值是不是一致就可以知道节点是否重复。 2.如何删除全部重复的节点?从开始就重复怎么办? 我们需要记录重复节点的前一个节点,如上面例子中从3开始重复,所以我们需要一个指针来记录2避免链表截...

爱喝舒化奶的博客 621

剑指 Offer 面试题 18. 删除链表的节点

点击上方“图解面试算法”,选择“星标”公众号重磅干货,第一时间送达大家好,我是程序员吴师兄。今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 面试题18. 删除链表的节...

程序员吴师兄的博客 543

力扣刷题记录(一)剑指Offer(第二版)

本系列记录力扣刷题过程,本文是第一次,剑指Offer(第二版)的记录。 我并没有按照题目的顺序刷,而是按照题的类型刷的,比如从链表开始做,接下来是数组,排序等等。

AnChenliang_1002的博客 1227

剑指offer18:删除链表的节点 python

剑指offer18:删除链表的节点 python题目描述解法 题目描述 解法 class Solution: def deleteNode(self, head: ListNode, val: int) -> ListNode: node = head if head.val == val: #如果head就相等的话,那么直接返回head.next return head.next while head.next: #

weixin_43494312的博客 240

《剑指Offer》解题目录(更新完毕)

题目来源于LeetCode上的《剑指Offer》,这里做一个目录方便大家查找。另外有本人的LeetCode解题目录、《程序员面试金典》可点击链接查看。

Michael是个半路程序员 6160

剑指offer面试题18(java版):删除链表的节点

welcome to my blog 剑指offer面试题18(java版):删除链表的节点 务必掌握题目二的进阶代码 题目二的进阶代码 题目二的进阶代码(递归版本) 题目一描述 在O(1)时间内删除链表节点. 给定单向链表的头指针和一个节点指针, 定义一个函数在O(1)时间内删除该节点.链表节点定义如下: public class ListNode { int val; Lis...

littlehaes的博客 614

剑指offer | 面试题18:删除链表的节点

转载本文章请标明作者和出处 本文出自《Darwin的程序空间》 本文题目和部分解题思路来源自《剑指offer》第二版 开始行动,你已经成功一半了,献给正在奋斗的我们 题目 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点; 返回删除后的链表的头节点; 此次照原题有些许改动,参照leetcode 删除节点5; 解题分析 首先,这道题,我们要知道,单向链表的特点,单向链...

程序员大航子 1475

剑指Offer LeetCode 面试题18. 删除链表的节点

剑指Offer LeetCode 面试题18. 删除链表的节点

TrueDei 1965

【剑指Offer】面试题:链表

剑指Offer中一共有9道关于链表的面试题 如何在JS中创建一个链表 面试题6:从尾到头打印链表 题目描述:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。 方法一:栈(推荐) 思路:遍历链表,把链表节点从头到尾依次入栈;依次输出栈顶元素,并弹出栈顶元素。 方法二:递归 思路:每访问到一个节点的时候,先递归输出它后面的节点,再输出该节点自身。 面试题18:删除链表的...

Dora_5537的博客 567
上一篇: 剑指Offer(第二版)面试题17:打印从1到最大的n位数
下一篇: STL系列之四 heap 堆
xy_cpp
博客等级 码龄10年 119粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值