题解 | #从尾到头打印链表#

从尾到头打印链表

http://www.nowcoder.com/practice/d0267f7f55b3412ba93bd35cfa8e8035

解体思路:链表遍历的顺序是从头到尾,可是输出的顺序是从尾到头。也就是说,第一个遍历遍历到的节点最后一个输出,而最后一个遍历的节点第一个输出,这是典型的“后进先出”,所以想到用栈这种数据结构来实现。每遍历一个节点的时候,把该节点入栈;当遍历完整个链表后,再从栈顶开始逐个输出节点的值,此时的节点的顺序已经反过来了。这样就实现了从尾到头打印链表。

时间复杂度:O(n),n为链表的长度,每个节点仅遍历了一次;

空间复杂度:O(n),为递归使用栈的大小,为链表长度n;

代码由C++来实现:

class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> a;
        stack<int> s;
        //空链表的情况;
        if(head == nullptr){
            return a;
        }
        //如果链表不为空,将链表元素入栈;
        while(head != nullptr){
            s.push(head->val);
            head = head->next;
        }
        //元素出栈的过程就是从尾到头打印链表的结果
        while(!s.empty()){
            int temp = s.top();
            s.pop();
            a.push_back(temp);
        }
        return a;
    }
};

既然可以使用栈来实现,而栈本质上就是一个递归的结构,于是很自然就会想到用递归来实现。但是用递归来实现有一个问题:当链表非常长的时候,就会导致函数调用的层级很深,从而有可能导致函数调用栈溢出。显然用栈基于循环实现的代码的鲁棒性要好一些。

全部评论

相关推荐

把球:这个听过,你加了就会发现是字节的hr
点赞 评论 收藏
分享
牛客618272644号:佬携程工作怎么样,强度大吗
点赞 评论 收藏
分享
评论
4
收藏
分享
牛客网
牛客企业服务