从尾到头输出链表

156 阅读1分钟

从尾到头输出链表

「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战

题目

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

示例 1:

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

限制:

0 <= 链表长度 <= 10000

题目分析

这道题同样考察对栈的理解,栈是先进后出的,而链表是一个一个元素排队指向的,我们可以把链表中从头到尾入栈,这样尾部的元素就在栈顶了,也可以采用递归的方法,从头到尾遍历链表,遍历的节点值放入列表中,然后倒序输出。

代码实现

递归实现:

//30
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
     ArrayList<Integer> tmp = new ArrayList<Integer>();
    public int[] reversePrint(ListNode head) {
        reversecur(head);
        int[] result = new int[tmp.size()];
        for (int i = 0; i < result.length; i++) {
            result[i] = tmp.get(i);
        }
        return result;
    }

    public void reversecur(ListNode head) {
        if (head == null) {
            return;
        }
        reversecur(head.next);
        tmp.add(head.val);
    }
}

这是我用java实现的功能,每个题都用不同的解法和写法,我大体整理了一下自己的思路然后就写了,也没有再想其他的方法,如果你有更好的解法,欢迎和我留言,我们一起进步,一起学习数据结构,共同进步,通过这道题能更熟悉栈和递归的功能和特点。

从这道题中我们可以看到看到递归和栈有密不可分的关联,递归就是在方法运行的时候又出现调用自己的情况,递归不能无限制的调用下去,而是需要有一条条件,当条件满足的时候,方法返回上层的方法,如果能够跳出循环。递归在我们真正项目中也应用广泛,我们一定要注意递归的条件,如果不限制的递归下去,就可能导致栈的溢出。

今天的题目就先到这里,希望这篇文章对你有帮助。