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

题目:

输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。

解法一:使用栈

空间复杂度 O(n), 时间复杂度O(n)

  1. 使用辅助空间栈,从头开始遍历链表,将链表中的元素依次入栈。
  2. 将栈中元素依次弹出。
/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int>vec;
        if(head == NULL)
            return vec;
        stack<ListNode* >s;
        ListNode* p = head;
        
        while(p != NULL)
        {
            s.push(p);
            p = p->next;
        }
        
        while(!s.empty())
        {
            p = s.top();
            s.pop();
            vec.push_back(p->val);
        }
        return vec;
    }
};

解法二:递归

递归在本质上也是一个栈,所以可以用递归来实现链表的倒叙输出。

  1. 从头到尾,每次遍历一个元素,
  2. 递归遍历到最后一个元素时,再依次返回每个元素,添加到vector中(这时添加的顺序就是从尾到头的了)。

注意:当链表比较长的时候,不宜采用递归的方法,可能会导致函数调用栈溢出。

/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int>vec;
        if(head == NULL)
            return vec;
        Print(head, vec);
        return vec;
    }
    void Print(ListNode* head, vector<int > &v)
    {
        if(head!=NULL)
        {
            Print(head->next, v);
            v.push_back(head->val);
        }
        
    }
};

解法三:

思路,前两个解法都是不改变链表,现在将链表改为从尾到头串联,然后依次遍历链表,就可以达到原链表的从尾到头打印。

猜你喜欢

转载自blog.csdn.net/wchzh2015/article/details/88626047