1.题目
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
测试样例:
1->2->2->1
返回:true
2.分析
对于一个回文链表可以发现,当指针节点在对其进行遍历时,走到中间位置就等同于从中间倒着往前走
如 1->2->3->2->1,1->2->2->1
所以可以将中间以后的部分视为前半部分的反转
因此可以将中间以后的部分进行反转,就能得到一个和前半部分相同的链表,这也变成了判断回文结构的条件
3.代码示例
public class PalindromeList {
public boolean chkPalindrome(ListNode A) {
// write code here
if(A==null||A.next==null){
return false;
}
if(A.next.next==null){
return false;
}
//首先定义快慢指针得到链表的中间节点
ListNode slow = A;
ListNode fast = A;
while(fast!=null&&fast.next!=null){
slow=slow.next;
fast=fast.next.next;
}
//从链表的中间开始反转后续链表
ListNode tmp = slow;
ListNode cur = slow.next;
ListNode curNext = cur.next;
while(curNext!=null){
cur.next=tmp;
tmp=cur;
cur=curNext;
curNext=curNext.next;
}
slow.next=null;
cur.next=tmp;
//逐个对比前半部分链表和后半部分链表的反转
while(cur!=null){
if(cur.val!=A.val){
return false;
}
cur=cur.next;
A=A.next;
}
return true;
}
}