文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
回文链表
解题思路
快慢指针 + 反转链表。
- 初始化快慢指针 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论