《剑指offer》第十八题(在O(1)时间删除链表结点)
// 面试题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)时间删除链表结点)相关推荐
- 【剑指 offer】(十三)—— 在 O(1) 时间删除链表结点
struct ListNode {int val;ListNode* next; }; void DeleteNode(ListNode** pListHead, ListNode* pToBeDel ...
- 牛客网(剑指offer) 第八题 跳台阶
//题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. <?phpfunction jumpFloor($number) {if($number ...
- 剑指Offer(十九):顺时针打印矩阵
剑指Offer(十九):顺时针打印矩阵 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...
- 【剑指Offer】俯视50题之31 - 40题
[剑指Offer]俯视50题之31 - 40题 面试题31连续子数组的最大和 面试题32从1到n整数中1出现的次数 面试题33把数组排成最小的数 面试题34丑数 面试题35第一个仅仅出现一次的字符 面 ...
- 牛客网剑指offer编程实践1-10题
牛客网剑指offer编程实践1-10题 1.二维数组中的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这 ...
- 《剑指 Offer I》刷题笔记 51 ~ 61 题
<剑指 Offer I>刷题笔记 51_60 位运算(简单) 51. 二进制中 1 的个数 _解法1:逐伟判断 解法2:巧用 n&(n-1) 52. 不用加减乘除做加法(背题) 解 ...
- 《剑指 Offer I》刷题笔记 41 ~ 50 题
<剑指 Offer I>刷题笔记 41_50 排序(中等) 41. 最小的k个数# _解法1:排序 API + 数组复制 API 42. 数据流中的中位数 _解法1:暴力 搜索和回溯算法( ...
- 《剑指 Offer I》刷题笔记 20 ~ 30 题
<剑指 Offer I>刷题笔记 20_30 动态规划(简单) 20. 斐波那契数列 _解法1:迭代 解法2:记忆化递归 解法3:动态规划 21. 青蛙跳台阶问题 _解法1:动态规划 22 ...
- 《剑指 Offer I》刷题笔记 11 ~ 19 题
<剑指 Offer I>刷题笔记 11 ~ 19 题 查找算法(中等) 11. 二维数组中的查找 _解法 1:暴力迭代 解法 2:标志数 解法 3:逐行二分 12. 旋转数组的最小数字 _ ...
- 《剑指 Offer I》刷题笔记 1 ~10 题
<剑指 Offer I>刷题笔记 1 ~10 题 栈与队列(简单) 1. 用两个栈实现队列 _解法 1:暴力做法 解法 2:优化解法 1 2. 包含 min 函数的栈 _解法 1:pop( ...
最新文章
- iOS 计算两个日期之间的差值
- runLoop和runtime的分析
- OpenCV视频的处理
- thread php,php中关于线程thread的使用
- 大数据平台容量评估_大数据平台
- mysql 多行拼接注入_MySQL注入汇总
- 深度学习优化算法实现(Momentum, Adam)
- Onedrive云盘程序——OneManager小白设置指南
- flex弹性盒子布局
- 图像频域增强:陷波滤波器
- 代码记录:易语言中精易模块的json文本数据生成
- C语言中表示温度符号,摄氏度符号怎么打(SCI论文中摄氏度°C符号的正确输法)...
- Redis使用pipeline批量查询所有键值对以及multiGet用法
- IT猎头之挖角与反挖角
- uniapp设置整个页面背景颜色渐变,设置单个页面背景颜色
- 关于Numpy数组中属性shape的理解
- 【机器学习】一文读懂正则化与LASSO回归,Ridge回归
- 天秤座 的个人分析,真的很准,这段时间一直在关注星座。
- 项目1在线交流平台-4. 使用radis高性能储存方案-1.redis入门-特点、安装与支持数据类型
- 免费地图下载流量如何领取?