【题目】
【分析】
把前半部分反转,然后与后半部分比较即可。
【代码】
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isPalindrome(ListNode head) {
if(head==null || head.next==null) return true;
int n = 0;
ListNode p=head;
while(p!=null){ //1. 求出链表的长度n
n++;
p=p.next;
}
ListNode before = null;
for(int i=0; i<n/2; i++){ //2. 前半部分反转
p = head;
head = head.next;
p.next = before;
before = p;
}
if(n%2==1) head = head.next;
while(head!=null){ //3.前半部分before与后半部分head进行比较
if(head.val != before.val){
return false;
}
head = head.next;
before = before.next;
}
return true;
}
}
结果:
【分析】
还有一些其他的方法,比如把前半部分放入栈中,然后弹出的过程中与链表的后半段进行比较。但是空间复杂度为O(n)