《剑指offer》面试题6:从尾到头打印链表

输入一个链表的头结点,从尾到头反过来打印出每个节点的值。链表节点定义如下:

  struct ListNode {
        int val;
        struct ListNode *next;
        ListNode(int x) :
              val(x), next(NULL) {
        }
  };

解题思路1

因为题目要求是从尾往头地打印链表节点的值,而链表只能从头到尾地查找,因此是一个先入后出的过程,可以使用一个辅助栈来实现。

    #include <stack>
    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> ans;

        stack<int> S;
        while(head){
            S.push(head->val);
            head = head->next;
        }

        while(!S.empty()){
            ans.push_back(S.top());
            S.pop();
        }

        return ans;
    }

解题思路2

上一种方法是借助辅助栈基于循环的方法,事实上这个问题也可以看成一个递归问题,先得到一个节点后面所有节点的倒序输出,再加上节点本身,就可以递归地解决问题。递归比起循环来说有点是代码思路更简洁。(但是递归有可能递归深度太深而导致栈溢出,因此方法一的鲁棒性更好些。)

    void printCore(vector<int>&ans,ListNode* head){
        if (!head)  return;
        printCore(ans,head->next);
        ans.push_back(head->val);
    }
    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> ans;
        printCore(ans,head);
        return ans;
    }

猜你喜欢

转载自blog.csdn.net/acelove40/article/details/79799295
今日推荐