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

从尾到头打印链表

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-05 07:29
贵州大学 Java
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务