单向链表是一种常见的数据结构,在计算机科学中有着广泛的应用。在某些情况下,可能需要对一个单向链表进行逆转操作。本文将详细介绍如何使用非递归方法来实现这一功能。
单向链表由一系列节点组成,每个节点包含数据和指向下一个节点的引用(指针)。最后一个节点的指针通常指向空。
class ListNode:
def __init__(self, value):
self.value = value
self.next = None
逆转单向链表的目标是将每个节点的指针从指向下一个节点变为指向当前节点,从而实现整个链表方向的反转。
prev
、curr
和 next
,分别代表当前节点前一个节点(初始为空)、当前处理的节点和下一个待处理的节点。next
指向 prev
节点,并移动三个指针到下一个位置。curr
为空时,表示所有节点已经处理完毕。以下是使用 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)
此算法的时间复杂度为 ( O(n) ),其中 n 是链表的节点数。因为每一个节点都被遍历一次。
空间复杂度是 ( O(1) ),因为只使用了固定数量的额外指针变量,与输入规模无关。
非递归方法逆转单向链表是一种简单而有效的算法实现。通过迭代和适当的指针调整,可以在常数空间内完成链表方向的反转操作。这种方法在实际应用中具有较高的效率和灵活性。