1. 程式人生 > >在O(1)時間刪除連結串列結點——面試題13《劍指offer》

在O(1)時間刪除連結串列結點——面試題13《劍指offer》

題目:給定單向連結串列得頭指標和一個節點指標,定義一個函式在O(1)時間刪除該結點。連結串列結點與函式的定義如下:

struct ListNode
{
    int m_nValue;
    ListNode* m_pNext;
};

void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted)
{

    if(!pListHead ||!pToBeDeleted)    //節點不存在,則返回
        return;
    
    //被刪除的不是尾節點
    if(pToBeDeleted->m_pNext != NULL)
    {
        ListNode* pNext = pToBeDeleted->m_pNext;    //被刪除的下一個節點

        pToBeDeleted->m_nValue = pNext->m_nValue;    //賦值給被刪除的節點
        pToBeDeleted->m_pNext = pNext->m_pNext;
        delete pNext;
        pNext = NULL;
    }
    //僅有一個節點
    else if(*pListNode == pToBeDeleted)
    {
        delete pToBeDeleted;
        pToBeDeleted = NULL;
        *pListNode = NULL;
    }
    //刪除尾節點
    else
    {
        ListNode* pNode = *pListHead;
        while(pNode->m_pNext != pToBeDeleted)//找到最後一個節點
        {
            pNode = pNode->m_pNext;    //pNode 指向尾節點之前
        }
        pNode->m_pNext = NULL;
        delete pToBeDeleted = NULL;
        pToBeDeleted = NULL;            
    }
}