剑指 Offer 06. 从尾到头打印链表

105 阅读1分钟

一. 题目

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回).

示例 1:
输入: head = [1,3,2]
输出: [2,3,1]

二: 思路

其实题目的要求很简单,逆序将元素放入到数组中就可以了

思路1: 逆序其实就是栈,栈的特点就是先进后出,所以将链表依次入栈,然后再依次弹出放入数组就行了
思路2: 顺序遍历链表,依次逆序放入到数组中,也就是从左到右读取链表,放入数组是从右边往左边放

三: 代码实现

1. 先入栈再入数组
public class Solution {
    public int[] reversePrint(ListNode head) {
        Stack<Integer> stack = new Stack<>();
        while (head != null) {
            stack.push(head.val);
            head = head.next;
        }
        // size一定要拿出来,不可以写在for循环里,因为入栈出栈,栈的长度是变化的
        int size = stack.size();
        int[] array = new int[size];
        for (int i = 0; i < size; i++) {
            array[i] = stack.pop();
        }
        return array;
    }
}
2. 逆序直接放入数组
public class Solution {
    public int[] reversePrint(ListNode head) {
        ArrayList<Integer> list = new ArrayList<>();
        while (head != null) {
            list.add(head.val);
            head = head.next;
        }
        int size = list.size();
        int[] array = new int[size];
        for (int i = 0; i < size; i++) {
            array[i] = list.get(size - i -1);
        }
        return array;
    }
}