1. 程式人生 > >連結串列C++ | 從尾部列印頭部(使用棧、遞迴實現)_3

連結串列C++ | 從尾部列印頭部(使用棧、遞迴實現)_3

從尾部列印頭部

棧 - 實現:

void printListReversingly_Iteratively(ListNode** pHead)
{
    std::stack<ListNode*> nodes;

    ListNode* pNode = *pHead;
    while(pNode!=nullptr){
            nodes.push(pNode);
            pNode = pNode->m_pNext;}
            
    while(!nodes.empty()){
            pNode = nodes.top();
            printf("%d ",pNode->m_nValue);
            nodes.pop();}
}

測試程式碼:

#include<iostream>
#include<stack>

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

ListNode* AddToTail(ListNode** pHead, int Value)
{
    ListNode* pNew = new ListNode();
    pNew->m_nValue = Value;
    pNew->m_pNext = nullptr;

    if(*pHead == NULL){
        *pHead = pNew;}
    else{
        ListNode* pNode = *pHead;
        while(pNode->m_pNext != nullptr)
            pNode = pNode->m_pNext;
        pNode->m_pNext = pNew;}
    return *pHead;
}

void Delete(ListNode** pHead, int value)
{
    if(pHead == nullptr || *pHead == nullptr)
        return;

    ListNode* pToBeDelete = *pHead;
    if(value == 1)
        *pHead = pToBeDelete->m_pNext;
    else{
        ListNode* pNode = *pHead;
        for(int i=0;i<value-2;i++)
            pNode = pNode->m_pNext;

        pToBeDelete = pNode->m_pNext;
        pNode->m_pNext = pToBeDelete->m_pNext;
        }

    if(pToBeDelete!=nullptr){
        delete pToBeDelete;
        pToBeDelete = nullptr;
    }
}

void print(ListNode* pHead){
    printf("LinkedList is:\n");
    while(pHead!=nullptr)
    {
        printf("%d ", pHead->m_nValue);
        pHead = pHead->m_pNext;
    }
    printf("\n");
}

void printListReversingly_Iteratively(ListNode** pHead)
{
    std::stack<ListNode*> nodes;

    ListNode* pNode = *pHead;
    while(pNode!=nullptr){
            nodes.push(pNode);
            pNode = pNode->m_pNext;}
            
    while(!nodes.empty()){
            pNode = nodes.top();
            printf("%d ",pNode->m_nValue);
            nodes.pop();}
}

int main(){
    ListNode* pHead = nullptr;
    pHead = AddToTail(&pHead, 1);
    pHead = AddToTail(&pHead, 2);
    pHead = AddToTail(&pHead, 3);
    pHead = AddToTail(&pHead, 4);
    Delete(&pHead, 1);
    print(pHead);
    printListReversingly_Iteratively(&pHead);
}

執行結果:

遞迴 - 實現:

void printListReversingly_Recurrsively(ListNode* pHead)
{
    if(pHead!=nullptr){
        if(pHead->m_pNext!=nullptr){
            PrintListReversingly_Recurrsively(pHead->m_pNext);
        }
        printf("%d\t", pHead->m_nValue);
    }
}

測試程式碼:

#include<iostream>
#include<stack>

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

ListNode* AddToTail(ListNode** pHead, int Value)
{
    ListNode* pNew = new ListNode();
    pNew->m_nValue = Value;
    pNew->m_pNext = nullptr;

    if(*pHead == NULL){
        *pHead = pNew;}
    else{
        ListNode* pNode = *pHead;
        while(pNode->m_pNext != nullptr)
            pNode = pNode->m_pNext;
        pNode->m_pNext = pNew;}
    return *pHead;
}

void Delete(ListNode** pHead, int value)
{
    if(pHead == nullptr || *pHead == nullptr)
        return;

    ListNode* pToBeDelete = *pHead;
    if(value == 1)
        *pHead = pToBeDelete->m_pNext;
    else{
        ListNode* pNode = *pHead;
        for(int i=0;i<value-2;i++)
            pNode = pNode->m_pNext;

        pToBeDelete = pNode->m_pNext;
        pNode->m_pNext = pToBeDelete->m_pNext;
        }

    if(pToBeDelete!=nullptr){
        delete pToBeDelete;
        pToBeDelete = nullptr;
    }
}

void print(ListNode* pHead){
    printf("LinkedList is:\n");
    while(pHead!=nullptr)
    {
        printf("%d ", pHead->m_nValue);
        pHead = pHead->m_pNext;
    }
    printf("\n");
}

//void printListReversingly_Iteratively(ListNode** pHead)
//{
//    std::stack<ListNode*> nodes;
//
//    ListNode* pNode = *pHead;
//    while(pNode!=nullptr){
//            nodes.push(pNode);
//            pNode = pNode->m_pNext;}
//
//    printf("Revers LinkedList is:\n");
//    while(!nodes.empty()){
//            pNode = nodes.top();
//            printf("%d ",pNode->m_nValue);
//            nodes.pop();}
//}

void printListReversingly_Recurrsiverly(ListNode* pHead)
{
    if(pHead!=nullptr){
        if(pHead->m_pNext!=nullptr){
            printListReversingly_Recurrsiverly(pHead->m_pNext);
        }
        printf("%d ",pHead->m_nValue);
    }
}

int main(){
    ListNode* pHead = nullptr;
    pHead = AddToTail(&pHead, 1);
    pHead = AddToTail(&pHead, 2);
    pHead = AddToTail(&pHead, 3);
    pHead = AddToTail(&pHead, 4);
    Delete(&pHead, 1);
    print(pHead);
//    printListReversingly_Iteratively(&pHead);
    printListReversingly_Recurrsiverly(pHead);
}

執行結果:


對程式碼不滿足,是任何真正有天才的程式設計師的根本特徵。