剑指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);}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小狗脖子发硬疼的直叫怎么办 厨房里有很多小虫子围着鸡蛋怎么办 狗生小狗后几天不吃饭怎么办 还没满月的小兔子突然死了怎么办 宝宝小鸡被蚊子咬后肿得很大怎么办 不知道是哪知兔子下的小兔怎么办 兔子生完小兔不吃东西了怎么办 人工喂养七天的小羊拉希怎么办 仔兔出生3天吃过奶就尿怎么办 小兔子买回来两天不拉屎怎么办 大狗生了小狗把小狗咬死了怎么办 狗妈妈一直咬小狗的脐带怎么办 狗狗体内驱虫驱不干净怎么办 打老鼠脚被老鼠咬了怎么办 天正画的cad打开显示空白怎么办 苹果手机信息被拉进群聊怎么办 空调的控制线的报验资料怎么办 窗窗户罩子护栏上的瓦楞板怎么办 酸洗好的带钢容易返锈怎么办 化肥撤到小树苗上现在变黑了怎么办 尿素液烧的太慢了怎么办 天堂鸟肥料施多了黄叶了怎么办 死水塘养的鱼每天在死怎么办 北京的阿姆斯肥把苗都烧死了怎么办 纱窗被老鼠咬了个洞 怎么办 低电量模式下动态墙纸不能用怎么办 吃的包装袋执行标准错了怎么办 退换东西的时候外包装坏了怎么办 闲鱼买家以与描述不符退货怎么办 闲鱼买家申请退款又签收了怎么办 店铺买的手机是拆开过的怎么办 卖家以包装破损拒收快递怎么办 车辆迁出落户信封被自己拆开怎么办 快递签收了发现物品坏了怎么办 快递签收后发现货坏了怎么办 闲鱼退货有破损卖家要求赔偿怎么办 邮政快递收货后发现快递破损怎么办 中通把包裹发到别的省份去了怎么办 寄快递没拿单子但东西破损了怎么办 快递签收以后发现东西少了怎么办 淘宝时收到的货破损我该怎么办