题目描述
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
测试样例:
1->2->2->1返回:true
解题思路
1、先找到链表的中间节点,定义一个 fast 节点和 slow 节点,先让 fast 走两步,然后 slow 和 fast 同时走,当 fast.next 为 null 的时候,slow 就是中间节点
2、将单链表后半部分进行反转,因为如果是回文结构那么他们链表的左右两边就应该是对称的,类似于下图
反转后:
3、head 和 slow同时走,一个从头走、一个从尾走,当两个点重合的时候,循环结束,在这期间,head.val != slow.val 直接就返回 false,如果成功推出循环就返回 true;同时需要考虑一下偶数的情况,head.next = slow 时退出循环,链表也是回文结构
代码实现
public class PalindromeList {
public boolean chkPalindrome(ListNode A) {
// write code here
if (A == null){
return false;
}
if (A.next == null){
return true;
}
ListNode fast = A;
ListNode slow = A;
while (fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
}
ListNode cur = slow.next;
ListNode curNext = cur;
while (cur != null){
curNext = curNext.next;
cur.next = slow;
slow = cur;
cur = curNext;
}
while (A != slow && A.next != slow){
if (A.val != slow.val){
return false;
}
A = A.next;
slow = slow.next;
}
return true;
}
}