struct ListNode
{int val;ListNode* next;
};
void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted);

一般情况下,我们需要从头开始查找(时间复杂度为 O(n)O(n)),找到被删除节点的前一个结点。正如题目所言,是否一定需要得到被删除节点的前一个结点呢?答案是否定。我们可以找到一种等价做法,如果我们把下一个节点的内容(无非是 val 和指向下一个元素的指针)覆盖自身的内容,再把下一个结点删除。

这里需要注意两个问题,如果被删除的节点位于链表的尾部,那么他就没有下一个结点(next == NULL),此时值得从节点开始遍历,找到倒数第二个节点。

如果链表只有一个节点,而我们又要删除链表的头结点(也是尾节点),需要将链表的头结点置为 NULL。

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

【剑指 offer】(十三)—— 在 O(1) 时间删除链表结点相关推荐

  1. 【剑指offer-Java版】13O(1)时间删除链表结点

    O(1)时间删除链表结点 前提是调用者知道要删除的结点的指针,而不是要删除结点的值 不过此类删除问题,当然是存在各种边界条件了: 1) 链表中只有一个结点 - 删除唯一的一个 2) 要删除的结点是最后 ...

  2. 【剑指offer】面试题18:删除链表的节点(Java)

    给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点. 返回删除后的链表的头节点. 注意:此题对比原题有改动 示例 1: 输入: head = [4,5,1,9], val = 5 输出 ...

  3. 《剑指offer》第十八题(在O(1)时间删除链表结点)

    // 面试题18(一):在O(1)时间删除链表结点 // 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该 // 结点. #include <iostream> ...

  4. [剑指offer]面试题13:在O(1)时间删除链表结点

    面试题13:在O(1)时间删除链表结点 题目:给定单向链表的头指针和一个结点指针,定义一个函数在 O(1)时间删除该结点.链表结点与函数的定义如下: struct ListNode {int valu ...

  5. 《LeetCode力扣练习》剑指 Offer 25. 合并两个排序的链表 Java

    <LeetCode力扣练习>剑指 Offer 25. 合并两个排序的链表 Java 一.资源 题目: 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 示例1: ...

  6. 剑指Offer:合并两个排序的链表【25】

    剑指Offer:合并两个排序的链表[25] 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析 每次都是比较箭头节点,把小节点连接到已经合 ...

  7. LeetCode Algorithm 剑指 Offer 25. 合并两个排序的链表

    剑指 Offer 25. 合并两个排序的链表 Ideas 这题让我想到了归并排序: 划分问题:把序列分成元素个数尽量相等的两半: 递归求解:把两半元素分别排序: 合并问题:把两个有序表合并成一个. 捞 ...

  8. 【LeetCode】剑指 Offer 25. 合并两个排序的链表

    [LeetCode]剑指 Offer 25. 合并两个排序的链表 文章目录 [LeetCode]剑指 Offer 25. 合并两个排序的链表 一.递归 二.伪头节点 总结 一.递归 思路: 如果有一个 ...

  9. 剑指offer——面试题37:两个链表的第一个公共结点

    剑指offer--面试题37:两个链表的第一个公共结点 20180906整理 Solution1: 时间复杂度为O(n2)O(n2)O(n^2)的垃圾算法 /* struct ListNode {in ...

  10. 剑指offer系列——剑指 Offer 25. 合并两个排序的链表

    ⭐️前面的话⭐️ 大家好!本篇文章将介绍关于数据结构之链表的OJ题,来自力扣:21. 合并两个有序链表 或 剑指 Offer 25. 合并两个排序的链表 题解,展示代码语言暂时为:Java语言与C语言 ...

最新文章

  1. Mysql 查看连接数,状态 最大并发数 怎么设置才合理
  2. cocos2d-x游戏实例(21)-纵版射击游戏(8)
  3. java单个变量的表达式_java中使用Lambda表达式的5种语法
  4. 相对定向绝对定向 MFC 实现 CSU摄影测量学
  5. 学生寝室管理系统-C语言版
  6. 如何在word中输入带对号的方框
  7. 03_Snaker流程demo
  8. app端分页 简单的分页 java
  9. 【这不是经验】VS编译器初始化报错
  10. 直播出新规 这些行为会被限制参加活动
  11. Java使用Spire.Doc实现Word文档添加图片水印
  12. C# 之 Math取整数
  13. py.切片(slice)
  14. 记几个智能手表相关芯片 蓝牙芯片 低功耗
  15. web3.0的基石BYDK,带来革命性的新玩法,腾飞在即
  16. Unity中文离线文档以及提升访问速度
  17. 信息学奥赛一本通高手训练题解目录
  18. 通过$route.mete.show实现组件动态展示
  19. 【越狱开发】《我叫MT online》开源辅助工具
  20. RIS远程操作系统安装服务

热门文章

  1. Centos7安装完成找不到 ifconfig 网路设置命令
  2. 怎样才能恢复误删的数据-免费版本
  3. 洛谷P1127 词链 欧拉路问题
  4. 全局负载均衡通俗介绍_“集群和负载均衡”等的通俗解释
  5. curl get请求传递参数_curl 命令
  6. ubantu 黑屏_死机黑屏专题上线啦,早鸟只要299,看完薪水翻一番
  7. CUDA编程:与OpenCV结合
  8. android内容提供器读取图片,android实现拍照或从相册选取图片
  9. PE知识复习之PE的导入表
  10. springboot整合curator实现分布式锁