如题:

《剑指offer》c++版本 18.删除链表的结点_链表

这道题要求在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),感兴趣的同学可以加群讨论、交流、资料查找等,前进的道路上,你不是一个人奥^_^。