反转链表是一个常见的编程问题,可以通过迭代或递归的方法来实现。下面我会分别展示这两种方法的Python实现。
迭代方法
迭代方法通过遍历链表,逐个修改节点的指向来实现反转。
python复制代码
class ListNode: | |
def __init__(self, val=0, next=None): | |
self.val = val | |
self.next = next | |
def reverseListIterative(head): | |
prev = None | |
current = head | |
while current: | |
next_temp = current.next # 临时存储下一个节点 | |
current.next = prev # 反转当前节点的指向 | |
prev = current # 前置节点向前移动 | |
current = next_temp # 当前节点向前移动 | |
return prev # 当循环结束时,prev将指向新的头节点 | |
# 示例 | |
# 构建链表 1 -> 2 -> 3 -> 4 -> 5 | |
node1 = ListNode(1) | |
node2 = ListNode(2) | |
node3 = ListNode(3) | |
node4 = ListNode(4) | |
node5 = ListNode(5) | |
node1.next = node2 | |
node2.next = node3 | |
node3.next = node4 | |
node4.next = node5 | |
# 反转链表 | |
reversed_head = reverseListIterative(node1) | |
# 打印反转后的链表 | |
current = reversed_head | |
while current: | |
print(current.val, end=" -> ") | |
current = current.next | |
# 输出: 5 -> 4 -> 3 -> 2 -> 1 -> |
递归方法
递归方法通过递归地反转子链表,并将当前节点链接到反转后的子链表的末尾来实现反转。
python复制代码
def reverseListRecursive(head): | |
# 递归终止条件:如果链表为空或只有一个节点,那么它已经反转了 | |
if not head or not head.next: | |
return head | |
# 递归反转head.next及之后的链表 | |
new_head = reverseListRecursive(head.next) | |
# 将head.next的下一个节点指向head,实现反转 | |
head.next.next = head | |
# 避免形成环,将head的next指向None | |
head.next = None | |
return new_head | |
# 使用同样的链表示例进行反转 | |
reversed_head = reverseListRecursive(node1) | |
# 打印反转后的链表(同上) |
两种方法各有优缺点。迭代方法通常更容易理解和实现,且空间复杂度较低(O(1)),因为它只使用了几个额外的变量。递归方法则更加简洁,但可能因递归调用栈而占用更多空间(空间复杂度取决于链表长度),并且在某些情况下可能会遇到栈溢出的问题。