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

#include <iostream>
#include "List.h"void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted)
{if (!pListHead || !pToBeDeleted)return;// 第一种情况:要删除的结点不是尾结点if (pToBeDeleted->m_pNext != nullptr){ListNode* pNext = pToBeDeleted->m_pNext;//得到待删除节点的下一个节点pToBeDeleted->m_nValue = pNext->m_nValue;//将该节点的值和地址给覆盖待删除节点pToBeDeleted->m_pNext = pNext->m_pNext;delete pNext;//删除这个替罪羊pNext = nullptr;}// 第二种情况:链表只有一个结点,删除头结点(也是尾结点)else if (*pListHead == pToBeDeleted){delete pToBeDeleted;pToBeDeleted = nullptr;*pListHead = nullptr;//注意吧头结点置空
    }// 第三种情况:链表中有多个结点,删除尾结点else{ListNode* pNode = *pListHead;while (pNode->m_pNext != pToBeDeleted)//只能通过顺序查找并删除了
        {pNode = pNode->m_pNext;}pNode->m_pNext = nullptr;delete pToBeDeleted;pToBeDeleted = nullptr;}
}// ====================测试代码====================
void Test(ListNode* pListHead, ListNode* pNode)
{printf("The original list is: \n");PrintList(pListHead);printf("The node to be deleted is: \n");PrintListNode(pNode);DeleteNode(&pListHead, pNode);//注意这个函数的输入
printf("The result list is: \n");PrintList(pListHead);
}// 链表中有多个结点,删除中间的结点
void Test1()
{ListNode* pNode1 = CreateListNode(1);ListNode* pNode2 = CreateListNode(2);ListNode* pNode3 = CreateListNode(3);ListNode* pNode4 = CreateListNode(4);ListNode* pNode5 = CreateListNode(5);ConnectListNodes(pNode1, pNode2);ConnectListNodes(pNode2, pNode3);ConnectListNodes(pNode3, pNode4);ConnectListNodes(pNode4, pNode5);Test(pNode1, pNode3);DestroyList(pNode1);
}// 链表中有多个结点,删除尾结点
void Test2()
{ListNode* pNode1 = CreateListNode(1);ListNode* pNode2 = CreateListNode(2);ListNode* pNode3 = CreateListNode(3);ListNode* pNode4 = CreateListNode(4);ListNode* pNode5 = CreateListNode(5);ConnectListNodes(pNode1, pNode2);ConnectListNodes(pNode2, pNode3);ConnectListNodes(pNode3, pNode4);ConnectListNodes(pNode4, pNode5);Test(pNode1, pNode5);DestroyList(pNode1);
}// 链表中有多个结点,删除头结点
void Test3()
{ListNode* pNode1 = CreateListNode(1);ListNode* pNode2 = CreateListNode(2);ListNode* pNode3 = CreateListNode(3);ListNode* pNode4 = CreateListNode(4);ListNode* pNode5 = CreateListNode(5);ConnectListNodes(pNode1, pNode2);ConnectListNodes(pNode2, pNode3);ConnectListNodes(pNode3, pNode4);ConnectListNodes(pNode4, pNode5);Test(pNode1, pNode1);DestroyList(pNode1);
}// 链表中只有一个结点,删除头结点
void Test4()
{ListNode* pNode1 = CreateListNode(1);Test(pNode1, pNode1);
}// 链表为空
void Test5()
{Test(nullptr, nullptr);
}int main(int argc, char* argv[])
{Test1();Test2();Test3();Test4();Test5();system("pause");return 0;
}

转载于:https://www.cnblogs.com/CJT-blog/p/10485613.html

《剑指offer》第十八题(在O(1)时间删除链表结点)相关推荐

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

    struct ListNode {int val;ListNode* next; }; void DeleteNode(ListNode** pListHead, ListNode* pToBeDel ...

  2. 牛客网(剑指offer) 第八题 跳台阶

    //题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. <?phpfunction jumpFloor($number) {if($number ...

  3. 剑指Offer(十九):顺时针打印矩阵

    剑指Offer(十九):顺时针打印矩阵 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...

  4. 【剑指Offer】俯视50题之31 - 40题

    [剑指Offer]俯视50题之31 - 40题 面试题31连续子数组的最大和 面试题32从1到n整数中1出现的次数 面试题33把数组排成最小的数 面试题34丑数 面试题35第一个仅仅出现一次的字符 面 ...

  5. 牛客网剑指offer编程实践1-10题

    牛客网剑指offer编程实践1-10题 1.二维数组中的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这 ...

  6. 《剑指 Offer I》刷题笔记 51 ~ 61 题

    <剑指 Offer I>刷题笔记 51_60 位运算(简单) 51. 二进制中 1 的个数 _解法1:逐伟判断 解法2:巧用 n&(n-1) 52. 不用加减乘除做加法(背题) 解 ...

  7. 《剑指 Offer I》刷题笔记 41 ~ 50 题

    <剑指 Offer I>刷题笔记 41_50 排序(中等) 41. 最小的k个数# _解法1:排序 API + 数组复制 API 42. 数据流中的中位数 _解法1:暴力 搜索和回溯算法( ...

  8. 《剑指 Offer I》刷题笔记 20 ~ 30 题

    <剑指 Offer I>刷题笔记 20_30 动态规划(简单) 20. 斐波那契数列 _解法1:迭代 解法2:记忆化递归 解法3:动态规划 21. 青蛙跳台阶问题 _解法1:动态规划 22 ...

  9. 《剑指 Offer I》刷题笔记 11 ~ 19 题

    <剑指 Offer I>刷题笔记 11 ~ 19 题 查找算法(中等) 11. 二维数组中的查找 _解法 1:暴力迭代 解法 2:标志数 解法 3:逐行二分 12. 旋转数组的最小数字 _ ...

  10. 《剑指 Offer I》刷题笔记 1 ~10 题

    <剑指 Offer I>刷题笔记 1 ~10 题 栈与队列(简单) 1. 用两个栈实现队列 _解法 1:暴力做法 解法 2:优化解法 1 2. 包含 min 函数的栈 _解法 1:pop( ...

最新文章

  1. iOS 计算两个日期之间的差值
  2. runLoop和runtime的分析
  3. OpenCV视频的处理
  4. thread php,php中关于线程thread的使用
  5. 大数据平台容量评估_大数据平台
  6. mysql 多行拼接注入_MySQL注入汇总
  7. 深度学习优化算法实现(Momentum, Adam)
  8. Onedrive云盘程序——OneManager小白设置指南
  9. flex弹性盒子布局
  10. 图像频域增强:陷波滤波器
  11. 代码记录:易语言中精易模块的json文本数据生成
  12. C语言中表示温度符号,摄氏度符号怎么打(SCI论文中摄氏度°C符号的正确输法)...
  13. Redis使用pipeline批量查询所有键值对以及multiGet用法
  14. IT猎头之挖角与反挖角
  15. uniapp设置整个页面背景颜色渐变,设置单个页面背景颜色
  16. 关于Numpy数组中属性shape的理解
  17. 【机器学习】一文读懂正则化与LASSO回归,Ridge回归
  18. 天秤座 的个人分析,真的很准,这段时间一直在关注星座。
  19. 项目1在线交流平台-4. 使用radis高性能储存方案-1.redis入门-特点、安装与支持数据类型
  20. 免费地图下载流量如何领取?

热门文章

  1. mysql数据库的字符串表示什么意思_MySQL数据库的字符串类型详解(01)
  2. zend studio for Eclipse注册码及汉化
  3. 【laravel】用laravel在游览器中显示Hello World
  4. 《Node.js核心技术教程》读书笔记---思维导图版
  5. Vim YouCompleteMe 安装配置
  6. 最全的MySQL基础【燕十八传世】
  7. jenkins-git-gradle配置项目
  8. Android图片360全景旋转
  9. ScriptManager调用 无参数WebService
  10. 使用hexo yeele主题搭建个人博客