如题:
这道题要求在O(1)时间内删除链表节点。
常规解法是遍历链表,找到所需元素,使其前继节点的next指针指向待删节点的next指针,时间复杂度位O(n),不满足要求。除了遍历之外,还有一种更好的办法删除结点,如果结点存在后继元素的话,可以直接将后继元素所有值复制到待删元素,这时候直接删除后继即可,如果位于尾节点,则遍历链表,对于链表中只有一个元素的情况,这时候,待删结点即是头节点又是尾节点则需要特殊处理。这种方式的平均时间复杂度为O((n-1)O(1) + O(n))/n) = O(1),满足要求。
下面是本题c++编码:
void DeleteNode(ListNode **pListHead, ListNode *pToBeDeleted)
{
if (!pListHead || !pToBeDeleted)
return;
//要删除的节点不是尾节点
if (pToBeDeleted->m_pNext != nullptr)
{
ListNode *pNext = pToBeDeleted->m_pNext;
pToBeDeleted->m_nValue = pNext->m_nValue;
pToBeDeleted->m_pNext = pNext->m_pNext;
delete pNext;
pNext = nullptr;
}
//链表只有一个节点,删除头节点(也是尾节点)
else if (*pListHead == pToBeDeleted)
{
delete pToBeDeleted;
pToBeDeleted = nullptr;
*pListHead = nullptr;
}
//链表中有多个节点,删除尾节点
else
{
ListNode *pNext = *pListHead;
while (pNext->m_pNext != pToBeDeleted)
{
pNext = pNext->m_pNext;
}
pNext->m_pNext = nullptr;
delete pToBeDeleted;
pToBeDeleted = nullptr;
}
}
=============================================================================================
Linux应用程序、内核、驱动、后台开发交流讨论群(745510310),感兴趣的同学可以加群讨论、交流、资料查找等,前进的道路上,你不是一个人奥^_^。