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

从尾到头打印链表

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

需要注意的点:

  • 若使用Stack解决,可以直接使用java的Stack类,具体用法为:
  • stack.push() 入栈
  • stack.pop() 出栈
  • stack.isEmpty() 判断是否为空
  • 明确入栈/递归的终止条件:使用当前节点是否为null判断最为合适,使用listNode.next = null会将处理流程变复杂

复杂度分析:

  • 递归时间复杂度:O(n)——递归遍历一次链表
  • 递归空间复杂度:O(n)——递归栈所需最大空间为链表长度
  • 栈的时间复杂度:O(n)——遍历一次链表入栈为O(n),再出栈为O(n),因此为O(2n)=O(n)
  • 栈的空间复杂度:O(n)——栈所需最大空间为链表长度
import java.util.*;
/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        // 方法一:递归
        ArrayList<Integer> result = new ArrayList<>();
        addValRec(listNode,result);
        // return result;
        // 方法二:栈
        result.clear();
        addValStack(listNode, result);
        return result;
    }

    private static void addValRec(ListNode listNode, ArrayList<Integer> result){
        if(listNode != null){
            addValRec(listNode.next,result);
            System.out.println(listNode.val);
            result.add(listNode.val);
        }
    }
    private static void addValStack(ListNode listNode, ArrayList<Integer> result){
        Stack<Integer> resultStack = new Stack<>();
        while(listNode !=null){
            resultStack.push(listNode.val);
            listNode = listNode.next;
        }
        while(!resultStack.isEmpty()){
            result.add(resultStack.pop());
        }
    }
}

#剑指OFFER#
全部评论

相关推荐

不愿透露姓名的神秘牛友
今天 11:15
点赞 评论 收藏
分享
Lorn的意义:你这种岗位在中国现在要么牛马天天加班,要么关系户进去好吃好喝,8年时间,真的天翻地覆了,对于资本来说你就说一头体力更好的牛马,哎,退伍没有包分配你真的亏了。
点赞 评论 收藏
分享
强大的马里奥:不太可能,我校计算机硕士就业率99%
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务