返回

JavaScript刷leetcode第206题-反转链表(迭代法 + 递归法)

前端

链表概述

链表是一种常见的数据结构,通常用于存储和操作顺序数据。链表由一系列节点组成,每个节点包含一个值和指向下一个节点的指针。链表中的节点可以动态添加或删除,因此它非常适合处理不断变化的数据。

反转链表

反转链表是指将链表中节点的顺序颠倒。例如,对于链表1->2->3->4->5,反转后变成5->4->3->2->1。反转链表在某些算法和数据结构中非常有用,例如栈和队列。

解法一:迭代法

迭代法是一种常见的反转链表方法,它通过逐个遍历链表中的节点来实现。在迭代过程中,我们不断改变节点的指针指向,直到整个链表反转完成。

// 定义链表节点类
class ListNode {
  constructor(val, next) {
    this.val = val === undefined ? 0 : val;
    this.next = next === undefined ? null : next;
  }
}

// 定义反转链表函数
function reverseListIterative(head) {
  let prev = null;
  let current = head;

  while (current) {
    // 保存当前节点的下一个节点
    const nextNode = current.next;

    // 将当前节点的下一个节点指向反转后的链表
    current.next = prev;

    // 将当前节点更新为反转后的链表的头部
    prev = current;

    // 将当前节点更新为下一个节点
    current = nextNode;
  }

  return prev;
}

解法二:递归法

递归法是一种通过不断调用自身来解决问题的编程技巧。在反转链表问题中,我们可以使用递归法来逐个反转链表中的节点。

// 定义反转链表函数
function reverseListRecursive(head) {
  // 如果链表为空或只有一个节点,则直接返回
  if (!head || !head.next) {
    return head;
  }

  // 反转链表的其余部分
  const newHead = reverseListRecursive(head.next);

  // 将当前节点的下一个节点指向反转后的链表
  head.next.next = head;

  // 将当前节点的下一个节点指向null
  head.next = null;

  // 返回反转后的链表的头部
  return newHead;
}

比较

迭代法和递归法都是反转链表的常用方法。迭代法的实现相对简单,而递归法的实现更具数学美感。在实践中,您需要根据具体情况选择合适的方法。

结语

通过本文,您已经掌握了反转链表的两种解法:迭代法和递归法。这些方法不仅可以帮助您解决LeetCode第206题,还能加深您对链表操作的理解。