描述
给定一个链表,请判断该链表是否为回文结构。
1) 方法一:使用栈。时间复杂度O(n),空间复杂度O(n)
function isPail( head ) {
let stack = [];
let p = head;
while(p){
stack.push(p.val);
p = p.next;
}
let len = stack.length
for(let i=0;i<Math.floor(len/2);i++){
if(stack[i]!==stack[len-i-1]){
return false;
}
}
return true;
}
module.exports = {
isPail : isPail
};
2)方法二:使用快慢指针。时间复杂度O(n), 空间复杂度O(1)
- 翻转链表的前半部分,并同时定位到后半部分的第一个元素;
- 将反转后的前半部分 与 后半部分比较;
function isPail( head ) {
if(!head || !head.next){
return true;
}
let slow = head;
let fast = head;
let h = slow;
let pre = null;
while(fast && fast.next){
h = slow;
slow = slow.next;
fast = fast.next.next;
h.next = pre;
pre = h;
}
// 奇数时,slow指向中间节点,fast指向最后一个节点
// 偶数时,slow指向后半部分的第一个节点
if(fast){ //奇数时,使slow后移一位,指向后半部分的第一个节点
slow = slow.next
}
//前半部分 与 后半部分比较
while(slow && h){
if(h.val !== slow.val){
return false
}
h = h.next;
slow = slow.next
}
return true;
}
module.exports = {
isPail : isPail
};