返回

反转链表:K 个一组,轻松解决编程难题

闲谈

算法简介

反转链表是一项基本的数据结构操作,涉及改变链表中节点的顺序。K 个一组反转链表是指将链表中相邻的 K 个节点反转,同时保持链表的其余部分不变。

递归解法

递归解法采用分治策略,将问题分解为更小的子问题。具体步骤如下:

  1. 基线条件: 如果链表中剩余的节点数量小于 K,则直接返回链表。
  2. 反转前 K 个节点: 递归反转前 K 个节点,并返回反转后的头节点。
  3. 连接剩余链表: 将反转后的链表与剩余的链表连接起来,方法是将反转后的链表的尾节点指向剩余的链表的头节点。
  4. 返回反转后的链表的头节点: 返回反转后的整个链表的头节点。

示例代码:

def reverse_k_group(head, k):
  if not head or k == 1:
    return head

  dummy = ListNode(0)
  dummy.next = head

  prev = dummy
  curr = head

  while curr:
    count = 0
    next_prev = prev
    next_curr = curr

    while curr and count < k:
      next_curr = curr.next
      curr.next = prev
      prev = curr
      curr = next_curr
      count += 1

    next_prev.next = prev
    prev = next_prev
    curr = next_curr

  return dummy.next

迭代解法

迭代解法通过循环遍历链表,逐个反转 K 个节点。具体步骤如下:

  1. 初始化: 设置两个指针 prevcurr,分别指向链表的当前头节点和下一个节点。
  2. 反转 K 个节点: 进入一个循环,反转前 K 个节点。将 curr 指针向后移动一位,并将 prev 指针插入到 curr 之前。
  3. 连接剩余链表: 将反转后的链表与剩余的链表连接起来,方法是将反转后的链表的尾节点指向剩余的链表的头节点。
  4. 更新指针: 更新 prevcurr 指针,将它们指向反转后的链表的尾节点和剩余链表的头节点。
  5. 重复步骤 2-4: 重复步骤 2-4,直到遍历完整个链表。

示例代码:

def reverse_k_group(head, k):
  if not head or k == 1:
    return head

  dummy = ListNode(0)
  dummy.next = head

  prev = dummy
  curr = head

  while curr:
    count = 0
    next_prev = prev
    next_curr = curr

    while curr and count < k:
      next_curr = curr.next
      curr.next = prev
      prev = curr
      curr = next_curr
      count += 1

    next_prev.next = prev
    prev = next_prev
    curr = next_curr

  return dummy.next

总结

掌握 K 个一组反转链表算法对于解决各种编程问题至关重要。本文提供的递归和迭代两种解法提供了清晰的步骤和示例代码,帮助你深入理解这一算法并提高你的编程技能。通过实践和应用,你将能够轻松应对这一经典的编程难题。