题目描述:
Given a singly linked list, determine if it is a palindrome.
Follow up:
Could you do it in O(n) time and O(1) space?
这个题要求空间复杂度为O(1),不能一开始就逆序,然后逐个比较,这样不符合要求。
链表无非就是逆序,插入,这个题和Reorder list差不多。
代码如下:
public class Solution {
public boolean isPalindrome(ListNode head) {
if(head==null||head.next==null)
return true;
ListNode cur=head;
int sum=0;
while(cur!=null){
sum++;
cur=cur.next;
}
int n=(sum+1)/2;
cur=head;
while(n-->1)
cur=cur.next;
ListNode head2=cur.next;
cur.next=null;
head2=reverseList(head2);
while(head2!=null){
if(head2.val!=head.val)
return false;
head2=head2.next;
head=head.next;
}
return true;
}
public ListNode reverseList(ListNode head) {
if(head==null){
return null;
}
ListNode last=head;
while(last.next!=null){
last=last.next;
}
while(head!=last){
ListNode next=head.next;
head.next=last.next;
last.next=head;
head=next;
}
return head;
}
}