劍指offer之反向打印鏈表值

1 問(wèn)題

反向打印鏈表值

 
2 思考

1) 我們利用棧的思想,新進(jìn)后出,把鏈表的每個(gè)元素分別入棧之后再打印棧

2)既然上面用到了棧,我們應(yīng)該就會(huì)想到用到遞歸來(lái)實(shí)現(xiàn)

 
3 代碼實(shí)現(xiàn)

    #include <iostream>
    #include <stack>
    #include <stdlib.h>
     
    using namespace std;
     
    typedef struct node
    {
        int value;
        struct node *next;
    } Node;
     
    /**
     *把鏈表的每一個(gè)元素遍歷出來(lái)放進(jìn)棧,然后利用
     *棧把先進(jìn)后出的特點(diǎn),然后打印棧
     */
    void reverse_printf(Node *head)
    {
        if (head == NULL)
        {
            std::cout << "head is NULL" << std::endl;
            return;   
        }
        Node *p = head;
        stack<Node *> stk;   
        while (p != NULL)
        {
            stk.push(p);
            p = p->next;
        }
        while(!stk.empty())
        {
            Node *node = stk.top();
            std::cout << node->value << std::endl;
            stk.pop();
        }
    }
     
    /**
     *既然上面用到了棧,那么我們自然而然就會(huì)想到
     *用遞歸的思想,我們就自己調(diào)用自己直到遍歷到最后
     *很明顯我們遞歸的條件是最后一個(gè)原始的next不能為空
     */
    void reverse_printf1(Node *head)
    {
        /**這樣也行
        if (head == NULL)
        {
            return;   
        }
        reverse_printf1(head->next);
        std::cout << head->value << std::endl;**/
        if (head != NULL)
        {
            reverse_printf1(head->next);
            std::cout << head->value << std::endl;
        }
    }
     
     
    void printf(Node *head)
    {
        if (head == NULL)
        {
            std::cout << "head is NULL" << std::endl;
            return;   
        }
        Node *p = head;
        while (p != NULL)
        {
            std::cout << p->value << std::endl;
            p = p->next;
        }
    }
     
    int main()
    {
        Node *head = NULL;
        Node *node1 = NULL;
        Node *node2 = NULL;
        Node *node3 = NULL;
        head = (struct node*)malloc(sizeof(Node));
        node1 = (struct node*)malloc(sizeof(Node));
        node2 = (struct node*)malloc(sizeof(Node));
        node3 = (struct node*)malloc(sizeof(Node));   
        if (head == NULL || node1 == NULL || node2 == NULL || node3 == NULL)
        {
            std::cout << "malloc fail" << std::endl;
            return -1;
        }
        head->value = 0;
        head->next = node1;
     
        node1->value = 1;
        node1->next = node2;
     
        node2->value = 2;
        node2->next = node3;
     
        node3->value = 3;
        node3->next = NULL;
           
        printf(head);
        std::cout << "***************" << std::endl;
        reverse_printf(head);
        std::cout << "***************" << std::endl;
        reverse_printf1(head);
        free(head);
        free(node1);
        free(node2);
        free(node3);
        return 0;
       
    }
    
 
 
4 運(yùn)行結(jié)果

    0
    1
    2
    3
    ***************
    3
    2
    1
    0
    ***************
    3
    2
    1
    0

 



 


作者:chen.yu
深信服三年半工作經(jīng)驗(yàn),目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號(hào):編程入門到禿頭 或掃描下面二維碼
零基礎(chǔ)入門進(jìn)階人工智能(鏈接)