题目
给定一个链表的 头节点 head ,请判断其是否为回文链表。
如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。
示例1
输入: head = [1,2,3,3,2,1]
输出: true
示例2
输入: head = [1,2]
输出: false
解题思路
1.先试用快慢指针找到中间节点的位置。
2.然后将中间节点以后的部分逆序过来,末尾节点成为一个头结点。
3.同时从俩边开始遍历并判断。
//方法三,使用0(1)额外空间的方法
public static boolean isPalindrome3(Node head){
if(head==null||head.next==null){
return true;
}
Node n1=head;
Node n2=head;
while(n2.next!=null&&n2.next.next!=null){
n1=n1.next;//n1->mid
n2=n2.next.next;//n2->end
}
n2=n1.next;//中点的右边一个顶点
n1.next=null;
Node n3=null;
while(n2!=null){
n3=n2.next;
n2.next=n1;
n1=n2;//n1 move
n2=n3;//n2 move
}
n3=n1;
n2=head;
boolean res=true;
while(n1!=null&&n2!=null){
if(n1.value!=n2.value){
res=false;
break;
}
n1=n1.next;
n2=n2.next;
}
n1=n3.next;
n3.next=null;
while(n1!=null){
n2=n1.next;
n1.next=n3;
n3=n1;
n1=n2;
}
return res;
}
总结
这是在左佬的课上学到的空间复杂度为0(1)的解法,相比于用栈来解,无论是时间复杂度还是空间复杂度都下降了。