一起学习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、不...
玩家科普开挂工具!wpk辅助功... 玩家科普开挂工具!wpk辅助功能开透视工具,真是真的有挂(有挂教学)1、很好的工具软件,可以解锁游戏...
推荐一款开挂!微乐小程序辅助工... 推荐一款开挂!微乐小程序辅助工具,微乐手游微乐辅助免费-本来有辅助工具1、进入游戏-大厅左侧-新手福...
一分钟了解开挂软件!wpk辅助... 一分钟了解开挂软件!wpk辅助功能开透视工具,都是有挂(有挂解惑)wpk破解侠是真的助透视。每个模型...
必知教程开挂!微信小程序微乐辅... 必知教程开挂!微信小程序微乐辅助器,陕西微乐挖坑控制器-真是是真的有辅助教程进入游戏-大厅左侧-新手...
一分钟揭秘辅助教程!德扑之星辅... 您好,德扑之星这款游戏可以开挂的,确实是有挂的,需要了解加去威信【136704302】很多玩家在这款...
科技介绍透视挂!微乐小程序免费... 科技介绍透视挂!微乐小程序免费工具,陕西微乐小程序辅助-原来真的是有辅助方法微乐小程序免费工具透视方...
一分钟揭秘辅助插件!AAPoK... 一分钟揭秘辅助插件!AAPoKer辅助功能开透视工具,切实是有挂(竟然有挂)1、AAPoKer辅助器...
带你了解辅助!微信微乐小程序有... 带你了解辅助!微信微乐小程序有挂黑科技,微乐辅助工具哪个好用-切实真的是有辅助挂1、微信微乐小程序有...
热点推荐开挂软件!AAPoKe... 热点推荐开挂软件!AAPoKer辅助功能开透视工具,真是真的是有挂(真实有挂)一、AAPoKer游戏...