给定一个单链表和一个指定节点,在O(1)内删除指定节点。
测试用例:
功能测试:中间节点
特殊值测试:头结点,尾节点
struct ListNode{
int val;
ListNode* next;
ListNode(int n)
{
val=n;
next=nullptr;
}
};
bool deleteListNode(ListNode* head,ListNode* tobedelete)
{
bool f=false;
if(!head||!tobedelete)return f;
if(tobedelete==head)
{
delete head;
return !f;
}
else if(tobedelete->next==nullptr)
{
ListNode* pNode=head;
while(pNode->next!=tobedelete)
pNode=pNode->next;
pNode->next=nullptr;
delete tobedelete;
return !f;
}
else
{
ListNode* pNode=tobedelete->next;
tobedelete->val=pNode->val;
tobedelete->next=pNode->next;
delete pNode;
return !f;
}
return f;
}
分析下,当指定节点是尾节点时,时间复杂度在O(n),而当指定节点非尾节点时,时间复杂度在(n-1)*O(1),综合看,时间复杂度在(O(n)+O(1)*(n-1))/n,复杂度还是在O(1)。但是有个问题是不能确定tobedelete节点的存在,只能甩锅给deleteListNode的调用函数了。