编写一个函数,检查输入的链表是否是回文的。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题
思考过程:核心问题就是空间复杂度O(1)了 不然的话搞个数组或者栈存着比较肯定没问题。看到这道题就很想用快慢指针。。但是不知道怎么用因为如果第二个指针在中间那时间复杂度就太高了。如果在最后面就有不能反着遍历的问题。看了参考的解答先快慢指针 然后在把后半段反转在比较
/**
* 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,slow=head;
//快慢指针定位
if(head===null){
return true;
}
while(fast!=null && fast.next!=null){
slow=slow.next;
fast=fast.next.next;
}
//如果链表为偶数的话那么fast为空,如果链表为奇数的话fast不为空并且slow是最中间的节点
while(fast!=null){
slow=slow.next;
}
slow=reverse(slow);
fast=head;
while(slow!=null){
if(slow.val!=fast.val){
return false;
}
slow=slow.next;
fast=fast.next;
}
return true;
};
var reverse=function(head){
if(head.next===null){
return head;
}
let pre=null;
let cur=head;
while(cur!=null){
tmp=cur.next;
cur.next=pre;
pre=cur;
cur=tmp;
}
return pre;
}
有点问题 后面再看看 哪里出问题了。。。。。。。