请判断一个链表是否为回文链表。
示例 1:
输入: 1->2 输出: false 示例 2:
输入: 1->2->2->1 输出: true
解题思路
快慢指针 + 反转
遍历链表 fast 指针走两步 slow指针走一步,当 fast 指针遍历结束时,slow 指针正好处于链表的中位,slow 指针继续遍历同时反转链表获得 reverse 链表,对比 原始链表head 和 反转链表 reverse 即可得出是否为回文链表
代码实现
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {boolean}
*/
var isPalindrome = function(head) {
let fast = head
let slow = head
// 快慢指针遍历
while(fast && fast.next && fast.next.next){
slow = slow.next
fast = fast.next.next
}
let reverse = null
// 反转链表
while(slow){
[slow.next,reverse,slow] = [reverse,slow,slow.next]
}
let cur = head
// 反转链表对比原始链表
while(cur && reverse){
if(cur.val != reverse.val){
return false
}
cur = cur.next
reverse = reverse.next
}
return true
};
性能
时间复杂度:
空间复杂度: