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

135 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

一、题目描述

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

示例

示例1:

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

提示

限制: 0 <= 链表长度 <= 10000

难度:简单

此题为简单题,兄弟们可以重拳出击,没错,就是你想到的那种方法,简单粗暴!

二、思路分析

众所周知,力扣上,简单题是真简单,中等题有些困难,困难题看不懂答案。

题目解析

  1. 从头到尾打印链表,因为只需要逆向输出链表中结点的值,因此可以先遍历获取链表长度,并创建对应长度的数组,然后再次遍历链表并将数组逆向填充,最终输出数组就是需要的结果。
  2. 如果只想要遍历一次链表,可以在遍历的同时使用栈存放结点值,根据栈元素后入先出的特点,最终依次获取栈中元素到结果数组中返回。
  3. 还可以将链表结点值遍历存储到集合中,并使用集合内置的反转函数将集合内容反转,最后转成数组返回。

解题思路

从头到尾打印链表的三种方法中,都需要先将链表中的结点遍历存储到容器中,并在容器中进行相关操作。

三、AC 代码

链表节点结构定义

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

实现逻辑代码

  1. 获取链表长度并逆向存储输出
public int[] reversePrint(ListNode head) {
    //先遍历获取节点长度,再遍历存到数组中
    ListNode temp = head;
    int count = 0;
    while(temp != null){
        count++;
        temp = temp.next;
    }
    temp = head;
    int[] arr = new int[count];
    for(int i = 0; i < count; i++){
        arr[count-1-i] = temp.val;
        temp = temp.next;
    }
    return arr; 
}

image.png

  1. 使用栈遍历存储节点值并输出
public int[] reversePrint(ListNode head) {
    //使用栈存放元素
    Stack<Integer> stack = new Stack<Integer>();
    ListNode temp = head;
    while(temp != null){
        stack.push(temp.val);
        temp = temp.next;
    }

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

image.png

  1. 使用集合存放并倒序输出
public int[] reversePrint(ListNode head) {
    // 直接使用集合的reverse方法,并转成数组
    ListNode temp = head;
    List<Integer> list = new ArrayList<>();
    while(head != null){
        list.add(head.val);
        head = head.next;
    }
    int[] res = new int[list.size()];
    for(int i = list.size()-1; i >= 0; i--){
        res[list.size()-1-i] = list.get(i);
    }
    return res;
}

image.png

四、总结

知识点

  • 链表节点相关操作

最后

阳春三月,算法刷起来!LeetCode 剑指 Offer

简单题,不需要考虑太多,开干就是了。