206 反转链表-简单

题目:

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

解题思路

直接迭代,时间复杂度O(n),空间复杂度O(1)。

// 算法1:迭代
func reverseList(head *ListNode) *ListNode {
    var pre, after *ListNode
    for head != nil {
        after = head.Next
        head.Next = pre
        pre, head = head, after
    }
    return pre
}

算法2:假设链表为n1->n2->...->nk-1->nk->nk+1->...nm;如果从节点nk+1到结点nm均已经反转,即

n1->n2->...->nk-1->nk->nk+1<-...<-nm那么nk的操作则需要nk.Next.Next = nk

时间复杂度O(n),空间复杂度O(n),因为递归会达到n层。

// 算法2:递归
func reverseList(head *ListNode) *ListNode {
  if head == nil || head.Next == nil {return head}
  pre := reverseList(head.Next)
  head.Next.Next = head
  head.Next = nil
  return pre
}

最后更新于