反转链表-reverse linked list
假设存在链表 1 → 2 → 3 → Ø,我们想要把它改成 Ø ← 1 ← 2 ← 3。
在遍历列表时,将当前节点的 next 指针改为指向前一个元素。由于节点没有引用其上一个节点,因此必须事先存储其前一个元素。在更改引用之前,还需要另一个指针来存储下一个节点。不要忘记在最后返回新的头引用!
#非递归的形式
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
cur, prev = head, None
while cur:
cur.next, prev, cur = prev, cur, cur.next
return prev
复杂度分析
时间复杂度:O(n),假设 nn 是列表的长度,时间复杂度是 O(n)。
空间复杂度:O(1)。
#递归写法
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
if head== None or head.next==None:
return head
p = self.reverseList(head.next)
head.next.next, head.next = head, None
#别人的尾递归,无非就是记下前面的,和前面大同小异,但是运行时间好像是快那么一点,不过这都不决定,因为leetccode的运行时间提交多次的时间是不一样的,所以不用那么纠结运行时间,主要还是要分析好,时间复杂度。
class Solution:
def reverseList(self, head: ListNode, tail=None) -> ListNode:
if head: head.next, tail, head = tail, head, head.next
return self.reverseList(head, tail) if head else tail
Leetcode 官方解答已经非常好了,就不重复造轮子了。
复杂度分析
时间复杂度:O(n),假设 nn 是列表的长度,那么时间复杂度为 O(n)。
空间复杂度:O(n),由于使用递归,将会使用隐式栈空间。递归深度可能会达到 n 层。