题目描述
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
测试样例:
1->2->2->1
返回:true
题目链接:链表的回文结构
解题思路:
import java.util.*;
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class PalindromeList {
public boolean chkPalindrome(ListNode A) {
//1.先找到A的中间结点
int size=size(A);
int steps=size/2;
ListNode B=A;
for(int i=0;i<steps;i++){
B=B.next;
}
//2.对B链表进行逆置操作
ListNode prev=null;
ListNode cur=B;
while(cur!=null){
ListNode next=cur.next;
if(next==null){
B=cur;
}
cur.next=prev;
prev=cur;
cur=next;
}
//3.分别从A和B出发,比较元素是否相等
while(B!=null){
if(A.val!=B.val){
return false;
}
A=A.next;
B=B.next;
}
return true;
}
public int size(ListNode head){
int size=0;
ListNode cur=head;
while(cur!=null){
size++;
cur=cur.next;
}
return size;
}
}