剑指Offer算法实现之十三:在O(1)时间删除链表节点
来源:互联网 发布:手机怎么打开php视频 编辑:程序博客网 时间:2024/05/14 09:46
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点。链表节点与函数定义如下:
struct ListNode{ int m_nValue; ListNode *m_pNext;};void DeleteNode(ListNode **pListHead, ListNode *pToBeDeleted);
思路:
①单向链表,若按照常规思路,即使待删除节点的前继(若有)指向待删除节点的后继(若有)。搜索前继则需要O(n)时间
②可考虑逻辑删除。实际应用中(题目中给出的定义仅为示例),链表节点往往是通过指针指向实际被“链接”的数据,拷贝的成本很低。若有后继,则将后继数据拷贝至待删除节点N,再将后继物理删除。若无后继,则按照①中作物理删除。
编译环境:ArchLinux+Clang3,3,C++11
实现:
#include <iostream>#include <list>using namespace std;struct ListNode{ int m_nValue; ListNode *m_pNext;};void DeleteNode(ListNode **pListHead, ListNode *pToBeDeleted){ if (!pListHead || !pToBeDeleted) return; if (pToBeDeleted->m_pNext) { // 删除节点非节点 ListNode *ptr = pToBeDeleted->m_pNext; pToBeDeleted->m_nValue = ptr->m_nValue; pToBeDeleted->m_pNext = ptr->m_pNext; delete ptr; } else if (*pListHead == pToBeDeleted) { // 删除尾节点,删除后链表为空 *pListHead = pToBeDeleted->m_pNext; delete pToBeDeleted; } else { // 删除尾节点,删除后链表非空 ListNode *prev = *pListHead; while (prev->m_pNext != pToBeDeleted) { prev = prev->m_pNext; } prev->m_pNext = nullptr; delete pToBeDeleted; }}void printList(ListNode *phead){ ListNode *pNode = phead; while (pNode) { cout << pNode->m_nValue << '\t'; pNode = pNode->m_pNext; } if (phead) cout << endl;}int main(){ list<int> a{1,2,3}; a.reverse(); ListNode *phead = nullptr; for (auto i : a) { //构造链表1,2,3 phead = new ListNode{i, phead}; } printList(phead); DeleteNode(&phead, phead->m_pNext); printList(phead); DeleteNode(&phead, phead->m_pNext); printList(phead); DeleteNode(&phead, phead); printList(phead);}
- 剑指Offer算法实现之十三:在O(1)时间删除链表节点
- 剑指offer之在O(1)时间删除链表节点
- 剑指offer之面试题13:在O(1)时间删除链表节点
- 【剑指 offer】(十三)—— 在 O(1) 时间删除链表结点
- 剑指offer 面试题12 在O(1)时间删除链表节点
- 剑指Offer :面试题13 在O(1)时间删除链表节点
- 剑指offer 面试题13—在O(1)时间删除链表节点
- 剑指Offer面试题13(java版):在O(1)时间删除链表节点
- 剑指offer面试题13-在O(1)时间删除链表的节点
- LintCode-剑指Offer-(372)在O(1)时间复杂度删除链表节点
- 【剑指offer系列】 在O(1)时间删除链表节点___13
- 剑指offer-面试题13.在O(1)时间删除链表节点
- 剑指offer(14):在O(1)时间删除链表节点
- 剑指offer系列-T13在O(1)时间删除链表节点
- 剑指offer--面试题13:在O(1)时间删除链表节点
- 剑指Offer面试题13(java版):在O(1)时间删除链表节点
- 剑指offer-面试题13-在O(1)时间删除链表节点
- 剑指offer 13. 在O(1)时间删除链表节点
- [common-sln]: net工程进行大整改
- STM32 串口DMA(一)
- 作业疑点:关于Linux下数学函数math.h无法编译问题
- dag图中顶点覆盖问题
- C语言父子进程shell命令重定向到管道传递(双管道)
- 剑指Offer算法实现之十三:在O(1)时间删除链表节点
- hdu 1052 Tian Ji -- The Horse Racing
- poj3140 树状dp
- objective-c 内存管理小结
- 10382 - Watering Grass
- HDU2066 一个人的旅行 解题报告--Dijkstra
- SDKD Single training #10未完成题目
- 胜利大逃亡 hdu 1253 三维
- 07-php中的方法重写