给定一个单链表的头节点如何反转链表

反转链表是一个常见的编程问题,可以通过迭代或递归的方法来实现。下面我会分别展示这两种方法的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)),因为它只使用了几个额外的变量。递归方法则更加简洁,但可能因递归调用栈而占用更多空间(空间复杂度取决于链表长度),并且在某些情况下可能会遇到栈溢出的问题。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值