《劍指offer》鏈表的結點的插入刪除

#include <iostream>
#include <stack>
using namespace std;

struct ListNode
{
    int value;
    struct ListNode* next;
};
void addToTail(ListNode** pHead,int value)
{
    if(pHead == NULL) return;
    ListNode* pNew = new ListNode;//建立結點
    pNew->value = value;
    pNew->next = NULL;

    if(*pHead == NULL)
    {
        *pHead = pNew;
    }
    else
    {
        ListNode* p = *pHead;
        while(p->next != NULL)
        {
            p = p->next;
        }
        p->next = pNew;
    }
}
void removeNode(ListNode**pHead, int value)
{
    if(pHead == NULL || *pHead == NULL) return;   //pHead 不合法或者鏈表爲空
    ListNode* pToBeDelete = NULL;
    if((*pHead)->value == value)
    {
        pToBeDelete = *pHead;
        *pHead = NULL;
    }
    else
    {
        ListNode* pNode = *pHead;     //pNode指向結點value的前驅  或者最後一個結點
        while(pNode->next != NULL && pNode->next->value != value)
        {
            pNode = pNode->next;
        }
        if(pNode->next != NULL)          //value是鏈表中的結點
        {
            pToBeDelete = pNode->next;
            pNode->next = pToBeDelete->next;
        }
    }
    if(pToBeDelete != NULL)
    {
        delete pToBeDelete;
        pToBeDelete = NULL;
    }
}
void printNodeReversingly(ListNode* pHead)
{
    stack<ListNode*> nodes;
    ListNode* pNode = pHead;
    while(pNode != NULL)
    {
        nodes.push(pNode);
        pNode = pNode->next;
    }
    while(!nodes.empty())
    {
        pNode = nodes.top();
        nodes.pop();
        cout<<pNode->value<<'\t';
    }
    cout<<endl;

}
int main()
{
    ListNode* head = NULL;
    addToTail(&head, 1);
    addToTail(&head, 2);
    addToTail(&head, 3);
    addToTail(&head, 4);
    printNodeReversingly(head);
    removeNode(&head,4);
    removeNode(&head,3);
    printNodeReversingly(head);
    printNodeReversingly(NULL);
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章