单链表反转:四种方法实现

作者:4042024.02.23 06:26浏览量:5

简介:单链表反转是一种常见的链表操作,通常用于解决各种算法问题。本文将介绍四种方法来实现单链表反转,并分析它们的优缺点。

千帆应用开发平台“智能体Pro”全新上线 限时免费体验

面向慢思考场景,支持低代码配置的方式创建“智能体Pro”应用

立即体验

单链表反转(逆置)是一种常见的链表操作,可以通过多种方法来实现。以下是四种常见的方法:

  1. 迭代法

迭代法是通过遍历链表,逐个交换节点的前后指针来实现反转的。这种方法思路简单,容易理解,但需要额外的空间来存储临时节点。

  1. class ListNode:
  2. def __init__(self, val=0, next=None):
  3. self.val = val
  4. self.next = next
  5. def reverseList(head: ListNode) -> ListNode:
  6. prev = None
  7. curr = head
  8. while curr:
  9. next_node = curr.next
  10. curr.next = prev
  11. prev = curr
  12. curr = next_node
  13. return prev
  1. 递归法

递归法是通过递归地调用反转函数来实现反转的。这种方法避免了额外的空间开销,但需要注意递归深度过大的问题。

  1. def reverseList(head: ListNode) -> ListNode:
  2. if not head or not head.next:
  3. return head
  4. new_head = reverseList(head.next)
  5. head.next.next = head
  6. head.next = None
  7. return new_head
  1. 双指针法

双指针法是通过使用两个指针,一个慢指针和一个快指针,来交换节点的前后指针实现反转的。这种方法时间复杂度为O(n),空间复杂度为O(1)。

  1. def reverseList(head: ListNode) -> ListNode:
  2. if not head or not head.next:
  3. return head
  4. slow = head
  5. fast = head.next
  6. while fast and fast.next:
  7. slow = slow.next
  8. fast = fast.next.next
  9. fast = slow.next
  10. slow.next = None
  11. while fast:
  12. temp = fast.next
  13. fast.next = slow
  14. slow = fast
  15. fast = temp
  16. return slow
  1. 迭代法改进版(快慢指针)

迭代法改进版是利用快慢指针的思想,通过两个指针一次遍历链表,实现链表反转。这种方法避免了额外的空间开销,且时间复杂度为O(n)。在遍历过程中,快指针每次移动两步,慢指针每次移动一步,当快指针到达链表尾部时,慢指针刚好在倒数第二个节点。此时将慢指针指向None即可完成反转。然后,将快指针逐步向前移动并更新其下一个节点为慢指针,直到快指针移动到头部。最后返回快指针即可。

以上四种方法都可以实现单链表反转,各有优缺点。迭代法虽然需要额外的空间,但实现简单易懂;递归法避免了额外的空间开销,但需要注意递归深度过大的问题;双指针法时间复杂度为O(n),空间复杂度为O(1),是一种高效的方法;迭代法改进版利用快慢指针的思想,避免了额外的空间开销,且时间复杂度为O(n)。在实际应用中,可以根据具体情况选择合适的方法来实现单链表反转。

article bottom image

相关文章推荐

发表评论