对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
回文结构示例:
1->2->2->1
返回:true
方法实现:
public class PalindromeList {
public boolean chkPalindrome(ListNode A) {
// write code here
if(A == null || A.next == null) {
return true;
}
// 当前链表至少有两个节点
ListNode fast = A;
ListNode low = A;
while(fast!=null&&low!=null&&fast.next!=null) {
fast = fast.next.next;
low = low.next;
}
// 找到链表的中间位置
ListNode mid = low;
// 反转后半段链表
ListNode dummyHead = new ListNode(-1);
dummyHead.next = mid;
if(mid.val == A.val) {
return true;
}else {
if(mid.next == null) {
return false;
}else {
ListNode f = dummyHead.next;
ListNode s = f.next;
while(s!=null) {
f.next = s.next;
s.next = dummyHead.next;
dummyHead.next = s;
s = f.next;
}
// 两个链表开始从前向后遍历
fast = A;
while(A!=null&&dummyHead.next!=null) {
if(A.val != dummyHead.next.val) {
return false;
}
A = A.next;
dummyHead.next = dummyHead.next.next;
}
return true;
}
}
}
}