返回

JavaScript链表刷题(二):快乐树和反转链表

前端

大家好,欢迎来到 JavaScript 链表刷题系列的第二篇。今天,我们将一起解决两道经典的链表问题:快乐树和反转链表。

我们先来了解一下这两道题目的背景。

快乐树

在数学中,快乐数是一种经过一系列运算后最终会变为 1 的正整数。例如,19 是一个快乐数,因为它的迭代计算如下:

1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1

反转链表

链表是一种线性数据结构,由一组节点组成,每个节点包含一个值和指向下一个节点的指针。反转链表是指将链表中节点的顺序从头到尾翻转。

现在,我们开始解决这两道题目吧!

快乐树(JavaScript)

/**
 * 判断一个数字是否为快乐数
 *
 * @param {number} n 要判断的数字
 * @return {boolean} true/false
 */
const isHappyNumber = (n) => {
  // 保存已经检查过的数字,避免陷入死循环
  const set = new Set();

  while (n !== 1) {
    // 如果数字已经检查过,说明它不是快乐数
    if (set.has(n)) {
      return false;
    }

    // 将数字加入检查过的集合
    set.add(n);

    // 计算数字的平方和
    let sum = 0;
    while (n > 0) {
      const digit = n % 10;
      sum += digit * digit;
      n = Math.floor(n / 10);
    }

    // 更新数字为平方和
    n = sum;
  }

  // 如果数字最终变为 1,则它是快乐数
  return true;
};

反转链表(JavaScript)

/**
 * 反转链表
 *
 * @param {ListNode} head 链表的头节点
 * @return {ListNode} 反转后的链表的头节点
 */
const reverseList = (head) => {
  let prev = null;
  let current = head;

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

    // 反转当前节点的指针
    current.next = prev;

    // 更新 prev 和 current
    prev = current;
    current = next;
  }

  // 返回反转后的链表的头节点
  return prev;
};

希望这两道题目的解答能够帮助你加深对 JavaScript 链表的理解。如果你有任何问题或建议,欢迎在下方留言。

如果你对 JavaScript 链表感兴趣,我强烈推荐你阅读以下资源:

祝你编码愉快!