剑指Offer #03 从尾到头打印链表(递归)

题目来源:牛客网-剑指Offer专题
题目地址:从尾到头打印链表

题目描述

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

题目解析

方法一:
因为题目要求返回的顺序是从尾到头,所以我们可以采用递归的形式访问链表,在回归的过程才将节点的值存入ArrayList中,以达到逆序的目的。

/**
*    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> ans = new ArrayList<Integer>();
        visitLinkedList(ans, listNode);
        return ans;
    }
    /**
      * 递归访问链表
      * listNode表示当前访问节点
      */
    private void visitLinkedList(ArrayList<Integer> ans, ListNode listNode) {
        if (listNode == null) {
            return ;
        }
        visitLinkedList(ans, listNode.next);
        //回归的过程才将节点的值存入ArrayList中
        ans.add(listNode.val);
    }
}

方法二:
有的同学不想写递归,没关系~

其实计算机实现递归的方式就是利用栈,于是乎我们就可以用上栈这种数据结构,它具有“先进后出”这种特性。先遍历链表,按顺序将访问到的节点都压入栈中。最后,按照栈弹出元素的顺序存入ArrayList中

/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.Stack;
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        Stack<Integer> stack = new Stack<Integer>();
        ArrayList<Integer> ans = new ArrayList<Integer>();
        ListNode p = listNode;
        //将访问的元素压入栈中
        while (p != null) {
            stack.add(p.val);
            p = p.next;
        }
        //按照栈的弹出顺序存入ArrayList中
        while (!stack.isEmpty()) {
            ans.add(stack.pop());
        }
        return ans;
    }
}

如果本文对你有所帮助,要记得点赞哦~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章