leetcode206反转链表3解法:双指针、头插法、递归法

双指针

Go 复制代码
func reverseList(head *ListNode) *ListNode {
    if head == nil || head.Next == nil {
        return head
    }
    var pre *ListNode
    pre = nil
    cur := head

    for cur != nil  {
        nextP := cur.Next
        cur.Next = pre
        
        pre = cur
        cur = nextP
    }
    return pre
}

头插法

Go 复制代码
func reverseList(head *ListNode) *ListNode {
    if head == nil || head.Next == nil {
        return head
    }

    dummy := &ListNode{}
    cur := head

    for cur != nil {
        next := cur.Next

        cur.Next = dummy.Next
        dummy.Next = cur 
        cur = next
    }
    return dummy.Next
}

递归

Go 复制代码
func reverseList(head *ListNode) *ListNode {
    if head == nil || head.Next == nil {
        return head
    }

    // 现在节点
    cur := head
    // 保存下一个节点
    next := cur.Next

    ans := reverseList(next)
    //下一个节点指向自己
    next.Next = cur 
    // 自己指向空
    cur.Next = nil
    return ans
}