剑指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
越努力,越幸运