HOME

单向链表逆转非递归算法

单向链表是一种常见的数据结构,在计算机科学中有着广泛的应用。在某些情况下,可能需要对一个单向链表进行逆转操作。本文将详细介绍如何使用非递归方法来实现这一功能。

1. 链表的基本概念

定义

单向链表由一系列节点组成,每个节点包含数据和指向下一个节点的引用(指针)。最后一个节点的指针通常指向空。

节点结构示例

class ListNode:
    def __init__(self, value):
        self.value = value
        self.next = None

2. 单向链表逆转算法概述

逆转单向链表的目标是将每个节点的指针从指向下一个节点变为指向当前节点,从而实现整个链表方向的反转。

非递归方法步骤

  1. 初始化:设置三个指针 prevcurrnext,分别代表当前节点前一个节点(初始为空)、当前处理的节点和下一个待处理的节点。
  2. 遍历链表:从头开始遍历每个节点,依次更新这三个指针的关系。
  3. 调整指向关系:将当前节点的 next 指向 prev 节点,并移动三个指针到下一个位置。
  4. 结束条件:当 curr 为空时,表示所有节点已经处理完毕。

3. 实现代码示例

以下是使用 Python 语言实现单向链表逆转的非递归算法:

class ListNode:
    def __init__(self, value):
        self.value = value
        self.next = None

def reverse_linked_list(head: ListNode) -> ListNode:
    # 如果链表为空或只有一个节点,无需反转
    if not head or not head.next:
        return head
    
    prev = None  # 前一个节点
    curr = head  # 当前节点
    next_node = None  # 下一个节点

    while curr:
        next_node = curr.next  # 暂存当前节点的下一个节点
        curr.next = prev       # 将当前节点指向前一个节点
        prev = curr            # 更新前一个节点为当前节点
        curr = next_node       # 更新当前节点为暂存的下一个节点

    return prev  # 反转后的链表头节点

# 测试代码
node1 = ListNode(1)
node2 = ListNode(2)
node3 = ListNode(3)

node1.next = node2
node2.next = node3

reversed_head = reverse_linked_list(node1)

4. 性能分析

时间复杂度

此算法的时间复杂度为 ( O(n) ),其中 n 是链表的节点数。因为每一个节点都被遍历一次。

空间复杂度

空间复杂度是 ( O(1) ),因为只使用了固定数量的额外指针变量,与输入规模无关。

5. 结论

非递归方法逆转单向链表是一种简单而有效的算法实现。通过迭代和适当的指针调整,可以在常数空间内完成链表方向的反转操作。这种方法在实际应用中具有较高的效率和灵活性。