JZ06 从尾到头打印链表

115 阅读1分钟

leetcode.cn/problems/co…

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

 

示例 1:

输入:head = [1,3,2]

输出:[2,3,1]  

限制:

0 <= 链表长度 <= 10000

解法一:遍历求解

先遍历链表得出链表的总长度,然后循环将链表的值放入对应倒序的数组位置。

class Solution {
    public int[] reversePrint(ListNode head) {
        int count = 0;
        ListNode curNode = head;
        while (head != null) {
            head = head.next;
            count++;
        }

        int[] result = new int[count];

        for (int i = count - 1; i >= 0; i--) {
            result[i] = curNode.val;
            curNode = curNode.next;
        }
        return result;
    }
}

解法二:辅助栈法

解题思路:

链表特点: 只能从前至后访问每个节点。

题目要求: 倒序输出节点值。 这种 先入后出 的需求可以借助 栈 来实现。

算法流程:

  1. 入栈: 遍历链表,将各节点值 push 入栈。(Python​ 使用 append() 方法,​Java​借助 Stack 的 push()方法)。
  2. 出栈: 将各节点值 pop 出栈,存储于数组并返回。(Python​ 直接返回 stack 的倒序列表,Java ​新建一个数组,通过 pop() 方法将各元素存入数组,实现倒序输出)。

复杂度分析:

时间复杂度 O(N): 入栈和出栈共使用 O(N) 时间。

空间复杂度 O(N): 辅助栈 stack 和数组 result 共使用 O(N) 的额外空间。

class Solution {
    public int[] reversePrint(ListNode head) {
        Stack<Integer> stack = new Stack<>();
        while (head != null) {
            stack.push(head.val);
            head = head.next;
        }

        int size = stack.size();
        int[] result = new int[size];
        for (int i = 0; i < result.length; i++) {
            result[i] = stack.pop();
        }
        return result;
    }
}

解法三:递归法

解题思路:

利用递归: 先走至链表末端,回溯时依次将节点值加入列表 ,这样就可以实现链表值的倒序输出。

Java 算法流程:

  1. 递推阶段: 每次传入 head.next ,以 head == null(即走过链表尾部节点)为递归终止条件,此时直接返回。
  2. 回溯阶段: 层层回溯时,将当前节点值加入列表,即tmp.add(head.val)。 最终,将列表 tmp 转化为数组 res ,并返回即可。

复杂度分析:

时间复杂度 O(N): 遍历链表,递归 N 次。

空间复杂度 O(N): 系统递归需要使用 O(N) 的栈空间。

class Solution {
    public int[] reversePrint(ListNode head) {
        List<Integer> list = new ArrayList<>();
        reverse(head, list);

        int[] result = new int[list.size()];
        for (int i = 0; i < result.length; i++) {
            result[i] = list.get(i);
        }
        return result;
    }

    public void reverse(ListNode node, List<Integer> list) {
        if (node != null) {
            reverse(node.next, list);
            list.add(node.val);
        }
    }
}