剑指Offer之面试题6:从尾到头打印链表

举报
宇宙之一粟 发表于 2022/03/24 23:42:54 2022/03/24
1k+ 0 0
【摘要】 面试题6: 从尾到头打印链表输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2]输出:[2,3,1]限制:0 <= 链表长度 <= 10000 思路考察链表的基本操作,需要对做题者对链表的基本操作熟悉。递归方法利用递归也可以实现链表倒着输出,即每访问到一个结点的时候,先递归输出它后面的结点,再输出该结点自身,这样链表的结果就反过来...

面试题6: 从尾到头打印链表

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

示例 1:

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

输出:[2,3,1]

限制:

0 <= 链表长度 <= 10000

思路

考察链表的基本操作,需要对做题者对链表的基本操作熟悉。

  1. 递归方法

利用递归也可以实现链表倒着输出,即每访问到一个结点的时候,先递归输出它后面的结点,再输出该结点自身,这样链表的结果就反过来了。

class Solution:
    def reversePrint(self, head: ListNode) -> List[int]:    

        if not head: 
            return []

       return self.reversePrint(head.next) + [head.val]

此种方法时间复杂度: O ( n ) O(n) ,空间复杂度: O ( n ) O(n)

  1. 借助栈

借助于栈的先进后出的特点。先从头到尾遍历链表,然后把遍历的结果放入栈中(先进后出),最后输出栈,这样利用栈就实现了从尾到头输出链表元素。

class Solution:
    def reversePrint(self, head: ListNode) -> List[int]:    
        if not ListNode:
            return n
        stack = []  # 模拟栈
        while head:
           stack.append(head.val)
           head = head.next
        return stack[::-1]

时间复杂度 O ( n ) O(n) :n 是链表的长度,遍历整个链表

空间复杂度 O ( n ) O(n) :额外存储结点数组空间

  1. 反转后打印

如果借助于额外的空间的话,我们借助于一个列表。可以先把原链表遍历一遍,进行反转,反转后再打印输出。

class Solution:
    def reversePrint(self, head: ListNode) -> List[int]:    

        cur, pre = head, None
        while cur:
            temp = cur.next
            cur.next = pre
            pre = cur
            cur = temp
        
        res = []
        while pre:
            res.append(pre.val)
            pre = pre.next
        return res

时间复杂度 O ( n ) O(n) :n 是链表的长度,遍历这个链表

空间复杂度 O ( n ) O(n) :额外存储结点数组空间

总结

链表的题目还是很好理解的,也是整个算法中的基础。理解好链表的各种操作才好去理解其他的数据结构与算法思想,如果对链表实现感兴趣,推荐看之前写过的一篇 Python 实现链表的文章,点此处

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。