返回

链表反转:JavaScript代码演示反转链表的奥秘!

前端

认识链表和反转链表

链表是一种线性的数据结构,它由一系列称为节点的元素组成,每个节点包含数据和指向下一个节点的指针。反转链表是指将链表中节点的顺序从头到尾反转,使得最后一个节点成为第一个节点,以此类推。

两种反转链表的方式:迭代与递归

迭代方式

  • 初始化一个新的空链表,称为“反转链表”。
  • 遍历原链表,从头到尾逐个节点访问。
  • 对于每个遍历到的节点,将其从原链表中分离出来,并将其指针指向反转链表的第一个节点。
  • 重复步骤 2 和 3,直到所有节点都已反转。
  • 将反转链表返回作为结果。

递归方式

  • 递归终止条件:若链表为空或只有一个节点,则直接返回。
  • 反转链表的最后一个节点的指针指向null,代表反转链表的结束。
  • 对链表的其余部分递归调用反转链表函数。
  • 反转链表的第一个节点的指针指向反转链表的最后一个节点,形成反转后的链表。

JavaScript代码演示

迭代方式

/**
 * 反转链表
 *
 * @param {ListNode} head
 * @return {ListNode}
 */
const reverseListIterative = (head) => {
  let prev = null;
  let curr = head;

  while (curr) {
    const next = curr.next;
    curr.next = prev;
    prev = curr;
    curr = next;
  }

  return prev;
};

递归方式

/**
 * 反转链表
 *
 * @param {ListNode} head
 * @return {ListNode}
 */
const reverseListRecursive = (head) => {
  if (!head || !head.next) {
    return head;
  }

  const newHead = reverseListRecursive(head.next);
  head.next.next = head;
  head.next = null;

  return newHead;
};

应用场景

反转链表在数据结构中具有广泛的应用场景,包括:

  • 寻找链表的中间节点
  • 检测链表是否有环
  • 合并两个有序链表
  • 比较两个链表是否相等
  • 迭代链表中的所有元素

通过反转链表,我们可以高效地解决这些问题,从而提高算法的效率和代码的可读性。

总结

反转链表是一种重要的数据结构操作,它在许多算法和数据结构中都有应用。本文通过JavaScript代码演示了反转链表的两种实现方式:迭代方式和递归方式。同时,我们也探讨了反转链表的原理和应用场景。掌握这些知识,您将能够解决更多复杂的数据结构问题,并编写更有效的代码。