返回

LeetCode 206:反转链表,再现链表操作的精妙!

闲谈

LeetCode 206:反转链表

在计算机科学中,链表是一种常用的数据结构,由一系列节点组成,每个节点包含一个值和指向下一个节点的指针。反转链表是指将链表中的节点顺序颠倒过来。这是一个经典的算法问题,也是面试中经常被问到的。

反转链表有两种常见的方法:迭代和递归。

迭代法

迭代法是通过一个循环来反转链表。具体步骤如下:

  1. 初始化一个当前节点指针cur,指向链表的第一个节点。
  2. 初始化一个前一个节点指针pre,指向空节点。
  3. 循环以下步骤,直到cur为null:
    • 将cur的next指针指向pre。
    • 将pre指针指向cur。
    • 将cur指针指向cur的next节点。

经过循环后,pre将指向最后一个节点,而cur将指向null。此时,链表已经反转。

递归法

递归法是通过一个递归函数来反转链表。具体步骤如下:

  1. 递归函数的参数为一个节点指针head。
  2. 如果head为null,则返回null。
  3. 否则,递归调用函数本身,参数为head的next节点。
  4. 将head的next指针指向递归函数的返回值。
  5. 将head的next指针指向null。
  6. 返回head。

经过递归调用后,当head为null时,函数将返回null。此时,链表已经反转。

代码实现

# Definition for singly-linked list.
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def reverse_list_iterative(head):
    cur = head
    pre = None
    while cur:
        next_node = cur.next
        cur.next = pre
        pre = cur
        cur = next_node
    return pre

def reverse_list_recursive(head):
    if not head:
        return None
    new_head = reverse_list_recursive(head.next)
    head.next.next = head
    head.next = None
    return new_head

结语

反转链表是一种经典的算法问题,也是面试中经常被问到的。通过理解迭代和递归两种方法,可以掌握链表反转的精髓。在实际编程中,可以根据具体情况选择合适的方法来反转链表。