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