直接回答

迭代法:用 prev、curr 两个指针遍历链表,每步把 curr.next 指向 prev,然后两个指针整体后移,遍历结束 prev 就是新头。时间 O(n)、空间 O(1)。递归法:先递归反转 head.next 之后的部分,再把 head 接到反转后链表的尾部。

展开解析

迭代法是标准答案,关键是三行操作里先用临时变量保存 curr.next,否则断链丢失后继。递归法代码更短但要理解递归来写:reverse(head.next) 返回新头,head.next.next = head 把后继指向自己,head.next = null 断开原边;注意递归深度等于链长,超长链表有栈溢出风险,空间 O(n)。变体追问:反转前 N 个节点、反转 [m, n] 区间、K 个一组反转——都建立在基本反转之上,多加指针定位和拼接。易错点:忘记原头节点的 next 要置 null,否则产生环;递归版忘记返回新头。

示例

def reverse(head):
    prev = None
    while head:
        nxt = head.next
        head.next = prev
        prev, head = head, nxt
    return prev