剑指offer简单题(二)

是很想放弃啊,因为这些简单题对我来讲都已经很难了,而且做一遍两遍回过头再看时还是不会。有时候也不知道坚持的意义何在,可能也没有坚持很久吧,但是很多事不就是坚持了才会看到成效嘛,希望能够坚持的久一点吧。至少每天打开电脑后能坚持做一道题,总结一道吧。(不是每天都能打开电脑的【苦笑】)

3.从尾到头打印链表

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

从第一次开始做没有一点思路直接看题解,到隔了一段时候后再次做,瞬间想到反转链表的做法,不得不得还是有些许进步的。

方法一:先说反转链表吧。不知道为什么印象还挺深刻的。链表是从前往后只能用next来寻找的,没有下标,因此相对其进行反转,需要一个前置函数pre=None的。

class Solution:
    def reversePrint(self, head: ListNode) -> List[int]:
        # 对链表进行反转
        pre = None
        cur = head
        while cur:
            tmp = cur.next
            cur.next = pre
            pre = cur
            cur = tmp
        #结果要的不是链表,而是列表,因此需要一个列表对节点进行保存
        l = []
        while pre:
            l.append(pre.val)
            pre = pre.next
        return l

 对于反转链表,关键点在于前置节点和当前节点。让当前节点的next指向前置节点,然后再让当前节点赋值给前置节点,那么前置节点就相当于是逆序后的链表了,关键步骤也就是cur.next = pre, pre = cur。当前也需要开辟另一个内存保存原当前节点的下一个节点,以便能够继续传递。

方法二:采用列表保存节点,然后再对列表进行反转。

class Solution:
    def reversePrint(self, head: ListNode) -> List[int]:
        l = []
        while head:
            l.append(head.val)
            head = head.next
        return l[::-1]

 列表的反转:l[::-1],原理是切片的效果:l[开始下标位置, 结束下标位置, 步长]

方法三:递归。

class Solution:
    def reversePrint(self, head: ListNode) -> List[int]:
        
        # 递归,算法会先进行递推,再进行回溯
        return self.reversePrint(head.next) + [head.val] if head else []

递归嘛,就是看了代码我能理解,但是我自己不会写。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值