返回介绍

回文链表

发布于 2024-09-16 00:06:33 字数 1354 浏览 0 评论 0 收藏 0

题目内容

解题思路

快慢指针 + 反转链表。

  • 初始化快慢指针 slow、fast 指向 head,fast 每次走两步,slow 每次走一步,当 fast 走到最后,slow 位于中间位置,slow 在移动期间不断反转前半部分链表,反转后为 prev。
  • 判断链表长度的奇偶性,如果是奇数 (即此时 fast 不为 null),slow 再向后移动一步,过滤掉中间的公共节点。
  • prev 和 slow 此时分别为原链表的前半部分(反转后)和后半部分的头节点,循环判断 prev 和 slow 的值,都相同则返回 true,否则结束循环返回 false。

代码实现

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     val: number
 *     next: ListNode | null
 *     constructor(val?: number, next?: ListNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */

const isPalindrome = (head: ListNode | null): boolean => {
  let fast: ListNode | null = head;
  let slow: ListNode | null = head;
  let prev: ListNode | null = null;
  while (fast !== null && fast?.next !== null) {
    fast = fast?.next?.next;
    const next: ListNode | null = slow?.next;
    slow.next = prev;
    prev = slow;
    slow = next;
  }
  if (fast !== null) slow = slow?.next;

  while (slow !== null && prev !== null) {
    if (slow?.val !== prev?.val) return false;
    prev = prev?.next;
    slow = slow?.next;
  }
  return true;
};

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文