《剑指offer》刷题笔记(代码完整性):在O(1)时间删除链表结点
来源:互联网 发布:linux改变用户权限 编辑:程序博客网 时间:2024/06/07 07:20
《剑指offer》刷题笔记(代码完整性):在O(1)时间删除链表结点
- 转载请注明作者和出处:http://blog.csdn.net/u011475210
- 代码地址:https://github.com/WordZzzz/CodingInterviewChinese2
- 文章地址:https://github.com/WordZzzz/Note/tree/master/AtOffer
- 刷题平台:https://www.nowcoder.com/
- 题 库:剑指offer
- 编 者:WordZzzz
- 剑指offer刷题笔记代码完整性在O1时间删除链表结点
- 前言
- 题目描述
- 解题思路
- C版代码实现
- 顺序遍历
- 复制结点
前言
同样的,这道题牛客网上也没有。
题目描述
给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。链表结点与函数的定义如下:
struct ListNode{ int m_nValue; ListNode* m_pNext;}void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted);
解题思路
方法一:顺序遍历(时间复杂度O(n))
从单向链表中删除一个结点,最常规的做法就是从链表的头结点开始,顺序遍历查找要删除的结点,并在链表中删除该结点。之所以需要从头开始查找,是因为我们需要得到将被删除的节点的前面一个结点。在单向链表中,结点中没有指向前一个结点的指针,所以只好从链表的头结点开始顺序查找。
方法二:复制结点(时间复杂度O(1))
当然,我们并不是非得得到前一个结点才能来删除该结点。上图C中,我们要删除结点i,先把i的下一个结点j的内容复制到i,然后把i的指针指向结点j的下一个结点。此时再删除节点j,其效果刚好是把结点i给删除了。
但是,这种思路,需要考虑删除尾结点的问题,这个时候只能顺序遍历。同时,还要注意如果链表中只有一个结点的情况,记得删除之后把头结点设置为NULL。
C++版代码实现
顺序遍历
void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted){ if(!pListHead || !pToBeDeleted) return; ListNode* pNode = *pListHead; while(pNode->m_pNext != pToBeDeleted) { pNode = pNode->m_pNext; } pNode->m_pNext = nullptr; delete pToBeDeleted; pToBeDeleted = nullptr;}
复制结点
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; }}
系列教程持续发布中,欢迎订阅、关注、收藏、评论、点赞哦~~( ̄▽ ̄~)~
完的汪(∪。∪)。。。zzz
阅读全文
0 0
- 《剑指offer》刷题笔记(代码完整性):在O(1)时间删除链表结点
- 剑指offer 3.3 代码的完整性3- 在O(1)时间删除链表结点
- 《剑指Offer》学习笔记--面试题13:在O(1)时间删除链表结点
- 【剑指offer】O(1)时间删除链表结点
- 剑指offer—在O(1)时间删除链表结点(18-1)
- 【剑指Offer学习】【面试题13 :在O(1)时间删除链表结点】
- 剑指Offer-13-在O(1)时间删除链表结点
- 【剑指 offer】(十三)—— 在 O(1) 时间删除链表结点
- 剑指offer 面试题13:在O(1)时间删除链表结点(C++版)
- 剑指offer-面试题 13:在 O( 1)时间删除链表结点
- 剑指offer--面试题13:在O(1)时间删除链表结点
- 剑指Offer学习之面试题13 :在O(1)时间删除链表结点
- 剑指offer算法题之单链表的删除结点操作--面试题13:在O(1)时间删除链表结点
- 《剑指offer》:[2]O(1)时间删除链表结点
- 剑指offer(4)-O(1)时间删除链表结点
- 剑指offer--o(1)时间删除链表结点
- 剑指Offer笔记—— 数值的整数次方 在O(1)时间删除链表结点
- 【剑指offer】链表相关-在o(1)时间删除链表结点13
- 二.Spring4学习-----了解IOC (控制反转)
- Excel2013如何将阶梯分布在不同列的内容靠拢到一列里面
- css实现简单瀑布流以及存在的问题
- Vue 中使用 jQuery
- KeychainItemWrapper 'Couldn't add the Keychain Item.'
- 《剑指offer》刷题笔记(代码完整性):在O(1)时间删除链表结点
- 中国UV打印机市场前景探析
- VSTO Office二次开发对PowerPoint功能简单测试
- 一个方法两次不同的调用设置值一样,只是有一个设置值不一样的处理
- liunx中让history显示日期
- 面试阿里后的总结
- 在Ubuntu14.04中安装KDE plasma 5、Gnome3
- python机器学习库 sklearn官方文档译文
- LeetCode:405. Convert a Number to Hexadecimal