剑指Offer(第二版)06

Posted on 2022-11-24 21:20  梦中千秋  阅读(15)  评论(0编辑  收藏  举报

题目

@Author Tiam
@Date 2021/12/22 15:37
@Description: 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)
Definition for singly-linked list.
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}

	/**
    * 一. 递归遍历链表, 速度更快
    */
   ArrayList<Integer> tmp = new ArrayList<>();
   public int[] reversePrint1(ListNode head) {
       recur(head);
       int[] res = new int[tmp.size()];
       for(int i = 0; i < res.length; i++) {
           res[i] = tmp.get(i);
       }
       return res;
   }
   void recur(ListNode head) {
       if(head == null) return;
       //递归 反序储存 链表中的值.
       recur(head.next);
       tmp.add(head.val);
   }

   /**
    * 二. 辅助栈法 , 更易理解 ,消耗内存较少
    * @param head
    * @return
    */
   public int[] reversePrint2(ListNode head) {
       //辅助栈 ,先进后出
       LinkedList<Integer> stack = new LinkedList<>();
       while(head != null) {
           //将指定的元素追加到此列表的末尾.
           stack.addLast(head.val);
           head = head.next;
       }
       //创建一个栈大小的数组
       int[] res = new int[stack.size()];
       for(int i = 0; i < res.length; i++) {
           //从此列表中删除并返回最后一个元素。
           res[i] = stack.removeLast();
       }
       return res;
   }