JZ6 从尾到头打印链表

127 阅读1分钟

Day17 2023/01/24

题目链接

难度:简单

题目

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

如输入{1,2,3}的链表如下图:

返回一个数组为[3,2,1]

0 <= 链表长度 <= 10000

示例

输入:{1,2,3}
输出:[3,2,1]

思路


本题较为简单,我们可以先从头节点开始遍历确定链表长度(即返回的数组长度),然后再从数组的尾部循环依次将链表中的值赋值给数组元素。

关键点


  • 只有先确定了链表的长度,才能知道数组的长度,才能从尾部赋值。

  • 为什么有两句cur = head;,是因为在遍历链表确定链表长度后,此时cur指向的是链表的尾节点,所以之后要再让cur重新指回头节点。

算法实现


c++代码实现

#include <vector>
class Solution {
  public:
    vector<int> printListFromTailToHead(ListNode* head) {
        ListNode* cur = head; //遍历指针
        int len = 0; //链表长度
        while (cur) { 
            len++;
            cur = cur->next;
        }
        cur = head; //重新指回头节点
        vector<int> nums(len); //待返回数组
        for (int i = len - 1; i >= 0; i-- ){
            nums[i] = cur->val; //赋值
            cur = cur->next;
        }
        return nums;
    }
};

  • 时间复杂度 O(n)O(n) --- 遍历链表和数组都是循环n次,n为链表长度
  • 空间复杂度 O(1)O(1) --- 数组为必要空间,无额外辅助空间

总结

  • 这类题一般有多种解法,比如可以 翻转链表,然后再依次赋值给数组。