方法一:递归方式(比较难理解)
public boolean isPalindrome(ListNode head) {
return head == null || recurse (head, head) != null;
}
private ListNode recurse (ListNode node, ListNode head) {
if (node == null) return head;
ListNode res = recurse (node.next, head);
if (res == null) return res;
else if (res.val == node.val) return (res.next == null ? res : res.next);
else return null;
}
方法二:找到链表中点,并把前面部分链表翻转,再把前后两部分进行对比
public boolean isPalindrome(ListNode head) {
if(head == null || head.next == null){
return true;
}
ListNode pre = head;
ListNode p1 = head;
ListNode p2 = head.next;
ListNode p3 = p2;
while(p2.next != null && p2.next.next != null){ //尽量使用简洁的赋值,p1 = p1.next; p3 = p1.next这种方式会超时(?)
p2 = p2.next.next;
pre = p1;
p1 = p3;
p3 = p3.next;
p1.next = pre;
}
if(p2.next != null && p2.next.next == null){//odd
p3 = p3.next;
}
while(p3 != null){
if(p1.val != p3.val){
return false;
}
p1 = p1.next;
p3 = p3.next;
}
return true;
}