给定单向链表的头指针和一个节点指针,定义一个函数在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

越努力,越幸运