返回

手把手教你反转链表:三种思路,带你优雅解决 LeetCode 206!

闲谈







## **认识链表** 

链表是一种常见的数据结构,由一系列按顺序排列的节点组成。每个节点包含数据和指向下一个节点的指针。链表可以用来存储各种类型的数据,如数字、字符串或对象。链表的优点是插入和删除节点非常方便,不需要移动其他节点。但是,链表也有一个缺点,那就是查找节点相对困难,因为需要从头开始遍历链表。

## **三种反转链表的思路** 

### **1. 头插法** 

头插法是最简单的一种反转链表的方法。它从链表的第一个节点开始,将每个节点从链表中删除,然后将其插入到链表的头部。这样,当所有的节点都被处理完后,链表就反转了。

```python
def reverse_list_head_insert(head):
  """
  反转链表,采用头插法。

  参数:
    head:链表的头节点。

  返回值:
    反转后的链表的头节点。
  """

  new_head = None
  while head:
    next_node = head.next
    head.next = new_head
    new_head = head
    head = next_node

  return new_head

2. 尾插法

尾插法与头插法类似,但它从链表的最后一个节点开始,将每个节点从链表中删除,然后将其插入到链表的尾部。这样,当所有的节点都被处理完后,链表也反转了。

def reverse_list_tail_insert(head):
  """
  反转链表,采用尾插法。

  参数:
    head:链表的头节点。

  返回值:
    反转后的链表的头节点。
  """

  if not head:
    return None

  new_head = head
  while head.next:
    next_node = head.next
    head.next = next_node.next
    next_node.next = new_head
    new_head = next_node

  return new_head

3. 递归法

递归法是一种非常巧妙的反转链表的方法。它利用了链表的递归结构,将反转链表的问题分解成一个个更小的子问题,然后逐一解决这些子问题。

def reverse_list_recursive(head):
  """
  反转链表,采用递归法。

  参数:
    head:链表的头节点。

  返回值:
    反转后的链表的头节点。
  """

  if not head or not head.next:
    return head

  new_head = reverse_list_recursive(head.next)
  head.next.next = head
  head.next = None

  return new_head

选择合适的方法

这三种反转链表的方法各有优缺点。头插法和尾插法都是迭代法,实现简单,容易理解。但是,它们都需要遍历整个链表,时间复杂度为 O(n)。递归法虽然更难理解,但时间复杂度为 O(n),并且可以更方便地处理复杂的链表结构。

写在最后

在本文中,我们介绍了三种反转链表的方法:头插法、尾插法和递归法。我们还探讨了每种方法的优缺点,帮助你选择最适合自己需求的方法。希望本文对你有所帮助。