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

该博客介绍了如何通过两种方法解决链表逆序输出的问题。解法一是使用双端队列,从链表头部开始,将节点值依次插入队列前端,然后从队列尾部取出并构建数组。解法二是先遍历链表获取长度,再遍历一次链表,从数组尾部插入节点值。两种方法的时间复杂度均为O(n),空间复杂度也为O(n)。

链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/

标签:链表

题目

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

输入: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) {
        Deque<Integer> res = new LinkedList<>();
        int count = 0;

        while (head != null) {
            res.offerFirst(head.val);
            head = head.next;
            count++;
        }

        int[] values = new int[count];
        count = 0;
        while (!res.isEmpty()) {
            values[count++] = res.poll();
        }

        return values;
    }
}

时间复杂度O(n),空间复杂度O(n)

在这里插入图片描述

解法二

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public int[] reversePrint(ListNode head) {
        ListNode node1 = head;
        int count = 0;
        while (node1 != null) {
            count++;
            node1 = node1.next;
        }

        int[] nums = new int[count];
        ListNode node2 = head;
        while (node2 != null) {
            nums[--count] =  node2.val;
            node2 = node2.next;
        }
        
        return nums;
    }
}

时间复杂度O(n), 空间复杂度O(n)
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值