返回

反转单向链表:两种简便方法剖析!

前端

前言

在计算机科学领域,链表是一种重要的数据结构,它由一组节点组成,每个节点包含一个数据值和指向下一个节点的指针。单向链表是指每个节点只能指向其后的一个节点,而不能指向其前面的节点。链表的优势在于其插入和删除元素的效率很高,但查找元素的效率却相对较低。

反转单向链表是指将链表中节点的顺序颠倒过来,使最后一个节点成为第一个节点,而第一个节点成为最后一个节点。这在某些情况下很有用,例如当我们需要从链表的尾部开始处理数据时。

反转单向链表的方法

反转单向链表有两种常见的方法:

  1. 迭代法

迭代法是反转单向链表最简单的方法之一。其基本思想是:

  • 定义一个空的前节点(prev),用于保存当前节点的前一个节点。
  • 定义一个指向头节点的迭代指针(curr),用于遍历链表。
  • 遍历迭代指针,将当前节点的next节点备份。
  • 将当前节点的next指向刚定义的前节点。
  • 移动前节点到当前节点,移动当前节点到其下一个节点。
  • 重复上述步骤,直到迭代指针到达链表的尾节点。

代码示例:

def reverse_list_iterative(head):
    """
    反转单向链表(迭代法)

    参数:
        head:链表的头节点

    返回:
        反转后的链表的头节点
    """

    prev = None
    curr = head

    while curr:
        # 备份当前节点的next节点
        next_node = curr.next

        # 将当前节点的next指向刚定义的前节点
        curr.next = prev

        # 移动前节点到当前节点
        prev = curr

        # 移动当前节点到其下一个节点
        curr = next_node

    return prev
  1. 递归法

递归法是另一种反转单向链表的方法。其基本思想是:

  • 定义一个辅助函数,用于反转链表的一部分。
  • 如果当前节点为空,则返回空。
  • 否则,调用辅助函数反转链表的其余部分。
  • 将当前节点的next指向反转后的链表的头节点。
  • 返回当前节点。

代码示例:

def reverse_list_recursive(head):
    """
    反转单向链表(递归法)

    参数:
        head:链表的头节点

    返回:
        反转后的链表的头节点
    """

    def reverse_list_helper(curr):
        if not curr:
            return None

        # 调用辅助函数反转链表的其余部分
        next_node = reverse_list_helper(curr.next)

        # 将当前节点的next指向反转后的链表的头节点
        curr.next = next_node

        # 返回当前节点
        return curr

    return reverse_list_helper(head)

比较

迭代法和递归法的优缺点如下:

  • 迭代法的时间复杂度为O(n),空间复杂度为O(1),因为只需要一个额外的指针来保存前一个节点。
  • 递归法的平均时间复杂度为O(n),空间复杂度为O(n),因为每次递归调用都会创建一个新的栈帧。
  • 迭代法更容易理解和实现,而递归法更简洁,但可能会更难理解。

结语

反转单向链表是一种重要的数据结构操作,有两种常见的方法:迭代法和递归法。迭代法更简单易懂,而递归法更简洁。选择哪种方法取决于具体的情况。