一起学习LeetCode热题100道(24/100)
创始人
2024-11-13 14:42:22
0

24.回文链表(学习)

给你一个单链表的头节点 head ,请你判断该链表是否为
回文链表
。如果是,返回 true ;否则,返回 false 。

示例 1:
在这里插入图片描述
输入:head = [1,2,2,1]
输出:true

示例 2:
在这里插入图片描述
输入:head = [1,2]
输出:false

提示:
链表中节点数目在范围[1, 105] 内
0 <= Node.val <= 9

解析:
一、找到链表的中点
1.初始化两个指针 slow 和 fast,都指向链表的头节点 head。
2.进入循环,条件为 fast 和 fast.next 都不为 null(确保 fast 可以安全地移动两步)。
3.在循环内部,slow 指针每次向前移动一步(slow = slow.next),fast 指针每次向前移动两步(fast = fast.next.next)。
4.当循环结束时,slow 指针要么指向链表的中点(如果链表长度是偶数),要么指向中间两个节点的第一个(如果链表长度是奇数)。

二、反转链表的后半部分
1.从 slow 指针开始反转链表。注意,如果链表长度是奇数,我们实际上是从 slow.next 开始反转的,因为 slow 已经是指向中间节点的指针了。
2.使用三个指针 prev(初始化为 null),curr(初始化为 slow 或 slow.next,取决于链表长度是否为奇数),和 nextTemp 来反转链表。
3.在循环中,将 curr.next 保存到 nextTemp,然后将 curr.next 指向 prev,接着将 prev 向前移动到 curr,最后将 curr 向前移动到 nextTemp。
4.循环继续,直到 curr 为 null。此时,prev 就是反转后的链表的头节点。

三、比较前半部分和反转后的后半部分
1.初始化两个指针 p1 和 p2,分别指向原链表的头节点 head 和反转后的链表的头节点 prev。
2.进入循环,条件为 p2 不为 null(确保我们可以安全地遍历反转后的链表的后半部分)。
3.在循环内部,比较 p1.val 和 p2.val。如果它们不相等,则返回 false,因为链表不是回文的。
4.如果它们相等,则将 p1 和 p2 都向前移动一步(p1 = p1.next 和 p2 = p2.next)。
5.循环结束后,如果没有提前返回 false,则说明链表是回文的,返回 true。

var isPalindrome = function(head) {      if (!head || !head.next) return true;          let slow = head;       let fast = head;       let prevPtr = null;          // 使用快慢指针找到中点       while (fast && fast.next) {           prevPtr = slow;           slow = slow.next;           fast = fast.next.next;       }          // 如果链表长度为奇数,则跳过中点       if (fast) {           slow = slow.next;       }          // 反转链表的后半部分       let secondHalf = reverseList(slow);          // 比较前半部分和反转后的后半部分       let p1 = head;       let p2 = secondHalf;       while (p2) {           if (p1.val !== p2.val) {               return false;           }           p1 = p1.next;           p2 = p2.next;       }          // 如果需要,可以在这里恢复链表(可选)          return true;  };  function reverseList(head) {       let prev = null;       let curr = head;       while (curr) {           let nextTemp = curr.next;           curr.next = prev;           prev = curr;           curr = nextTemp;       }       return prev; // 新的头节点   }   

相关内容

热门资讯

现就发布提示!哈糖大菠萝有没有... 现就发布提示!哈糖大菠萝有没有挂"曝光辅助软件"竟然真的有挂(哔哩哔哩)1、在哈糖大菠萝有没有挂插件...
连日来!微乐陕西三代自建房怎么... 连日来!微乐陕西三代自建房怎么提高胜率"辅助辅助app"原来是真的有挂(哔哩哔哩)1、让任何用户在无...
一直以来!心悦填大坑作辅助下载... 一直以来!心悦填大坑作辅助下载"科普辅助脚本"都是存在有挂(哔哩哔哩)1、进入游戏-大厅左侧-新手福...
黑科技教程!钱塘十三水辅助器软... 黑科技教程!钱塘十三水辅助器软件"详细辅助软件"本来是真的有挂(哔哩哔哩)1、下载好钱塘十三水辅助器...
透视模拟器!激k辅助器是真的吗... 透视模拟器!激k辅助器是真的吗"详细辅助工具"都是真的有挂(哔哩哔哩)1、这是跨平台的激k辅助器是真...
有玩家发现!闲逸碰胡辅助软件下... 有玩家发现!闲逸碰胡辅助软件下载"解谜辅助技巧"果然是真的有挂(哔哩哔哩)在进入闲逸碰胡辅助软件下载...
出现新变化!中至黑科技辅助软件... 出现新变化!中至黑科技辅助软件"曝光辅助神器"真是真的是有挂(哔哩哔哩)1)中至黑科技辅助软件免费钻...
第三方辅助挂!枫叶辅助脚本&q... 第三方辅助挂!枫叶辅助脚本"详细辅助攻略"切实确实有挂(哔哩哔哩)在进入枫叶辅助脚本软件靠谱后,参与...
近年来!爱玩辅助"推... 近年来!爱玩辅助"推荐辅助教程"果然确实有挂(哔哩哔哩)1、不需要AI权限,帮助你快速的进行爱玩辅助...
总结辅助挂!哈糖大菠萝可以开挂... 总结辅助挂!哈糖大菠萝可以开挂吗"普及辅助器"好像真的是有挂(哔哩哔哩)1、点击下载安装,哈糖大菠萝...