从尾到头打印链表(剑指offer 06)

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

一、题目描述



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


示例 1:

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

输出:[2,3,1]


限制:

0 <= 链表长度 <= 10000


/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public int[] reversePrint(ListNode head) {
    }
}



二、思路讲解


     

要实现从尾到头输出,很容易想到使用栈的先进后出。


三、算法描述


     

将链表里的值一一压入栈中,再一一弹出,使用数组保存即可。


四、Java代码实现



/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public int[] reversePrint(ListNode head) {
    Stack<ListNode> stack = new Stack<ListNode>();
    int size = 0; //用以保存链表的长度
    //将链表中的值一一压入栈中
    while(head != null) {
      stack.push(head);
      size++;
      head = head.next;
    }
    int []a = new int[size];
    //将栈中的值逐一弹出,并用数组接收保存
    for(int i=0; i<size; i++) {
      a[i] = stack.pop().val;
    }
    return a;
    }
}



五、时空复杂度分析



时间复杂度:O(n)        正向遍历一遍链表,反向遍历一遍栈


空间复杂度:O(n)        使用额外的一个栈保存数据


执行用时:1 ms, 在所有 Java 提交中击败了71.90%的用户


内存消耗:39 MB, 在所有 Java 提交中击败了57.02%的用户


相关文章
|
2月前
《剑指offer》——合并两个排序的链表
《剑指offer》——合并两个排序的链表
|
2月前
剑指 Offer 35:复杂链表的复制
剑指 Offer 35:复杂链表的复制
28 0
|
2月前
|
Java C语言
剑指offer(牛客)——合并两个排序的链表
剑指offer(牛客)——合并两个排序的链表
16 1
|
2月前
|
存储 Java C语言
剑指offer(牛客)——从尾到头打印链表
剑指offer(牛客)——从尾到头打印链表
19 1
|
2月前
【一刷《剑指Offer》】面试题 17:合并两个排序的链表
【一刷《剑指Offer》】面试题 17:合并两个排序的链表
|
2月前
【一刷《剑指Offer》】面试题 15:链表中倒数第 k 个结点
【一刷《剑指Offer》】面试题 15:链表中倒数第 k 个结点
|
2月前
|
机器学习/深度学习
【一刷《剑指Offer》】面试题 13:在 O(1) 时间删除链表结点
【一刷《剑指Offer》】面试题 13:在 O(1) 时间删除链表结点
|
2月前
【一刷《剑指Offer》】面试题 5:从尾到头打印链表
【一刷《剑指Offer》】面试题 5:从尾到头打印链表
|
2月前
剑指 Offer 18. 删除链表的节点
剑指 Offer 18. 删除链表的节点
28 0
|
2月前
剑指Offer06.从尾到头打印链表
剑指Offer06.从尾到头打印链表
27 0