js一刷 自解法一
javascript
var isPalindrome = function(head) {
let p1=head
let temp=null;
while(p1.next){
p1.prev=temp;
temp=p1;
p1=p1.next;
}
p1.prev=temp;
let p2=head
while(p1!=p2){
if(p1.val!=p2.val) return false;
p1=p1.prev;
p2=p2.next;
}
return true;
};
缺点:修改了原链表
js一刷 法二
javascript
//找中间结点
function FindMiddle(head){
let slow=head,fast=head;
while(fast!=null&&fast.next!=null){
slow=slow.next;
fast=fast.next.next;
}
return slow;
}
//反转链表
function ReserveList(head){
let rehead=null,cur=head;
while(cur){
let temp=cur.next;
cur.next=rehead;
rehead=cur;
cur=temp;
}
return rehead;
}
var isPalindrome = function (head) {
let flag=true
let midNode=FindMiddle(head);
let p1=ReserveList(midNode);
let p2=head;
while(p1){
if(p1.val!=p2.val){
flag=false;
break;
}
p1=p1.next;
p2=p2.next;
}
//复原链表
ReserveList(midNode);
return flag;
};
算法核心:分为四部分
1.找中间节点(快慢指针)
2.反转链表(头插)
3.双指针变量
4.再次反转复原链表