返回

LeetCode-206反转链表 |刷题打卡

前端

高效反转链表的两种方法 - 迭代法与递归法

在计算机科学领域,链表是一种广泛使用的线性数据结构,它由一系列相互连接的节点组成,每个节点包含数据和指向下一个节点的指针。链表的应用场景非常广泛,包括但不限于数据存储、排序、查找等。在众多链表操作中,链表反转是一个经典且重要的操作,它要求将链表中节点的顺序颠倒过来,从而得到一个新的反转后的链表。

在LeetCode-206中,我们面临的就是这样的一个链表反转问题。为了解决这个问题,我们提供了两种方法:迭代法和递归法。这两种方法各有千秋,迭代法更加简单易懂,而递归法则更加简洁高效。

迭代法

迭代法是解决链表反转问题最直观的方法。其基本思想是使用两个指针,一个指针指向当前节点,另一个指针指向下一个节点。然后,我们将当前节点的下一个指针指向它的上一个节点,并将当前节点的指针指向它的下一个节点。重复这个过程,直到遍历完整个链表,即可得到反转后的链表。

def reverse_list_iterative(head):
    # 如果链表为空或只有一个节点,则直接返回
    if not head or not head.next:
        return head

    # 初始化两个指针,一个指向当前节点,另一个指向下一个节点
    prev = None
    curr = head

    # 循环遍历链表
    while curr:
        # 将当前节点的下一个指针指向它的上一个节点
        next_node = curr.next
        curr.next = prev

        # 将当前节点的指针指向它的下一个节点
        prev = curr
        curr = next_node

    # 返回反转后的链表的头结点
    return prev

递归法

递归法是解决链表反转问题的另一种方法。其基本思想是使用一个辅助函数来递归地反转链表。在辅助函数中,我们将当前节点的下一个指针指向它的上一个节点,然后递归地反转链表的剩余部分。重复这个过程,直到遍历完整个链表,即可得到反转后的链表。

def reverse_list_recursive(head):
    # 如果链表为空或只有一个节点,则直接返回
    if not head or not head.next:
        return head

    # 调用辅助函数来递归地反转链表的剩余部分
    new_head = reverse_list_recursive(head.next)

    # 将当前节点的下一个指针指向它的上一个节点
    head.next.next = head

    # 将当前节点的下一个指针指向空
    head.next = None

    # 返回反转后的链表的头结点
    return new_head

比较

迭代法和递归法都是解决链表反转问题的有效方法。迭代法更加简单易懂,而递归法则更加简洁高效。在实际应用中,我们可以根据具体情况选择使用哪种方法。

结语

通过本文,我们学习了如何使用迭代法和递归法来反转链表。希望这些内容对您有所帮助。如果您有任何问题或建议,欢迎在评论区留言。