• 剑指offer 删除链表的节点


    给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点。

    1 struct ListNode {
    2     int val;
    3     ListNode *next;
    4 };
     1 void DeleteNode(ListNode* &pListHead, ListNode* pToBeDeleted):
     2     if (!pListNode || !pToBeDeleted) {
     3         return;
     4     }
     5 
     6     if (pToBeDeleted->next != nullptr) {//要删除的节点不是尾节点
     7         ListNode* pNode = pToBeDeleted->next;
     8         pToBeDeleted->val = pNode->val;
     9         pToBeDeleted->next = pNode->next;
    10         
    11         delete pNode;
    12         pNode = nullptr;
    13     } else if (pListHead == pToBeDeleted) {//链表只有一个节点
    14         
    15         delete pToBeDeleted;
    16         pToBeDeleted = nullptr;
    17         pListHead = nullptr;
    18     } else {//链表有多个节点,删除尾节点
    19         ListNode* pNode = pListHead;
    20         while (pNode->next != pToBeDeleted) {
    21             pNode = pNode->next;
    22         }
    23         pNode->next = nullptr;
    24         delete pToBeDeleted;
    25         pToBeDeleted = nullptr;
    26     }
    27     

     时间复杂度分析:对于n-1个非尾节点来说,都可以在O(1)时间内删除节点。对于删除尾节点,时间复杂度是O(n)。

    因此平均时间复杂度为[(n - 1) * O(1) + O(n)] / n

  • 相关阅读:
    node爬取html乱码
    mysql字段有中英文,数字按照升序/降序 排序
    解决git反复输入密码的问题
    vue在jsx中使用for循环
    vscode插件篇
    table无法控制宽度
    console输出彩色字体
    原生js实现vue组件功能
    ES6中的proxy
    面向对象编程
  • 原文地址:https://www.cnblogs.com/qinduanyinghua/p/11249902.html
Copyright © 2020-2023  润新知