• {面试题5: 从尾到头打印链表}


    From 剑指Offer 何海涛 著

    #include <iostream>
    #include <stack>
    
    struct ListNode {
        int m_nValue;
        ListNode *m_pNext;
    };
    
    void printListRecursively(const ListNode *pHead) {
        const ListNode *curr = pHead;
        if(pHead != NULL) {
            printListRecursively(curr->m_pNext);
            std::cout << "-> " << curr->m_nValue;
        }
    }
    
    void printListIteratively(const ListNode *pHead) {
        std::stack<const ListNode*> stack;
        const ListNode *curr = pHead;
        while(curr != NULL) {
            stack.push(curr);
            curr = curr->m_pNext;
        }
        while(!stack.empty()) {
            curr = stack.top();
            std::cout << "-> " << curr->m_nValue;
            stack.pop();
        }
    }

    测试集:

    void AddToTail(ListNode **head, int value) {
        if(head != NULL) {
            ListNode **curr = head;
            while(*curr != NULL) {
                curr = &(*curr)->m_pNext;
            }
            *curr = new ListNode;
            (*curr)->m_nValue = value;
            (*curr)->m_pNext = NULL;
        }
    }
    
    void RemoveAllNodes(ListNode **head) {
        if(head != NULL) {
            ListNode *curr = *head;
            while(curr != NULL) {
                ListNode *toBeDeleted = curr;
                curr = curr->m_pNext;
                delete toBeDeleted;
            }
            *head = NULL;
        }
    }
    
    int main(int argc, char* argv[]) {
        ListNode *head = NULL;
        AddToTail(&head, 1);
        AddToTail(&head, 2);
        AddToTail(&head, 3);
        AddToTail(&head, 4);
        AddToTail(&head, 5);
        
        printListRecursively(head);
        std::cout << std::endl;
        printListIteratively(head);
    
        RemoveAllNodes(&head);
        
        return 0;
    }

    总结:

    虽然基于递归的代码看起来很简洁, 但有个问题: 当链表非常长时, 就会导致函数调用的层级很深, 从而可能导致函数调用栈溢出。显示用栈基于循环实现的代码的鲁棒性要好一些。

  • 相关阅读:
    K
    A
    C
    E
    2020/9/14
    hdu5306 hdu3954 cf438D
    2020/9/10-9/11
    题解
    2020/8/31
    2020/8/30
  • 原文地址:https://www.cnblogs.com/long3216/p/4439239.html
Copyright © 2020-2023  润新知