题目描述:对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
测试样例:
1->2->2->1
返回:true
思路:找到中间结点 mid ,将 mid 开始的结点反转,生成新链表,比较两个链表元素是否完全相同。
public class PalindromeList {
//求中间结点
public ListNode midNode(ListNode A){
ListNode fast = A;
ListNode slow = A;
while(fast != null){
if(fast.next == null){
break;
}
fast = fast.next;
slow = slow.next;
fast = fast.next;
}
return slow;
}
//逆置后面的链表
public ListNode reserve(ListNode mid){
ListNode p = null;
ListNode p1 = mid;
while(p1 != null){
p1 = mid.next;
mid.next = p;
p = mid;
mid = p1;
}
return p;
}
public boolean chkPalindrome(ListNode A) {
ListNode mid = midNode(A);
ListNode reserve = reserve(mid);
while(A != null && reserve != null){
if(A.val != reserve.val){
return false;
}
A = A.next;
reserve = reserve.next;
}
return true;
}
}
反转链表:https://blog.youkuaiyun.com/qq_43606352/article/details/97302310
求链表中间结点:https://blog.youkuaiyun.com/qq_43606352/article/details/97431037