關(guān)于鏈表的預(yù)備知識(shí)

定義結(jié)點(diǎn)

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

創(chuàng)建鏈表結(jié)點(diǎn)

ListNode* CreateListNode(int value)
{
    ListNode* pNode = new ListNode();
    pNode->m_nValue = value;
    pNode->m_pNext = nullptr;
    return pNode;
}

連接鏈表各結(jié)點(diǎn)

void ConnectListNodes(ListNode* pCurrent,ListNode* pNext)
{
    if(pCurrent == nullptr)
    {
        cout<<"Error to connect two nodes!"<<endl;
        exit(1);
    }
    pCurrent->m_pNext = pNext;
}

打印鏈表結(jié)點(diǎn)的值

void PrintListNode(ListNode* pNode)
{
    if(pNode == nullptr)
    {
        cout<<"Error to print node, the node is nullptr !"<<endl;
    }
    else
    {
        cout<<"The value in node is "<<pNode->m_nValue<<endl;
    }
}

打印整個(gè)鏈表中的值

void PrintList(ListNode* pHead)
{
    cout<<"Print list starts:"<<endl;
    ListNode* pNode = pHead;
    while(pNode!=nullptr)
    {
        cout<<pNode->m_nValue<<endl;
        pNode = pNode->m_pNext;
    }
    cout<<"Print list ends."<<endl;
}

刪除整個(gè)鏈表

void DestroyList(ListNode* pHead)
{
    ListNode* pNode = pHead;
    while(pNode!=nullptr)
    {
        pHead = pHead->m_pNext;
        delete pNode;
        pNode = pHead;
    }
}

在鏈表尾部加入結(jié)點(diǎn)

void AddToTail(ListNode ** pHead,int value)
{
    ListNode* pNew = new ListNode();
    pNew->m_nValue = value;
    pNew->m_pNext = nullptr;
    if(*pHead == nullptr)    //判斷如果此時(shí)鏈表為空,則插入的節(jié)點(diǎn)為頭節(jié)點(diǎn)
    {
        *pHead = pNew;
    }
    else
    {
        ListNode* pNode = *pHead;
        while(pNode->m_pNext != nullptr)
            pNode = pNode->m_pNext;
        pNode->m_pNext = pNew;
    }
}

特別注意,pHead是一個(gè)指向指針的指針,當(dāng)我們往一個(gè)空鏈表中插入結(jié)點(diǎn)時(shí),新插入的節(jié)點(diǎn)就是鏈表的頭指針。由于此時(shí)會(huì)改動(dòng)頭指針,因此必須把pHead參數(shù)設(shè)為指向指針的指針,否則出了這個(gè)函數(shù)pHead仍舊是一個(gè)空指針。
在鏈表中找到第一個(gè)含有某值的節(jié)點(diǎn)并刪除此節(jié)點(diǎn)

void RemoveNode(ListNode **pHead,int value)
{
    if(pHead == nullptr || *pHead == nullptr)
        return;
    ListNode* pToBeDeleted = nullptr;
    if((*pHead)->m_nValue == value)
    {
        pToBeDeleted = *pHead;
        *pHead = (*pHead)->m_pNext; 
    }
    else
    {
        ListNode* pNode = *pHead;
        while(pNode->m_pNext != nullptr && pNode->m_pNext->m_nValue != value)
              pNode = pNode->m_pNext;
         if(pNode->m_pNext !=nullptr && pNode->m_pNext->m_nValue == value)   //找到value值的上一個(gè)節(jié)點(diǎn)
        {
            pToBeDeleted = pNode->m_pNext;
            pNode->m_pNext = pNode->m_pNext->m_pNext; 
        }
    }
    if(pToBeDeleted != nullptr)
    {
        delete pToBeDeleted;
        pToBeDeleted = nullptr;
    }
}

總結(jié):考慮情況要全面。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容