思路:先找到单链表的中间节点,对后半部分进行反转,然后用两个指针分别指向链表的头部和中间节点,进行遍历比较。
定义节点类型:
class ListNode{
int val;
ListNode next;
public ListNode(int val){
this.val = val;
this.next =null;
}
}
public boolean isPalindrome(ListNode l){
if(l == null){
return false;
}else if(l.next == null){
return true;
}else if(l.next.next == null){
if(l.val==l.next.val){
return true;
}
}
ListNode head = new ListNode(0);
head.next = l;
ListNode p1 = head,p2 = head;
//找到中间节点
while(p2.next != null){
p1 = p1.next;
p2 = p2.next;
if(p2.next !=null){
p2= p2.next;
}
}
//反转
ListNode end = p1.next;
ListNode p3 = end.next;
while(p3 != null){
ListNode Next = p3.next;
end.next = Next;
p3.next = p1.next;
p1.next = p3;
p3 = Next;
}
ListNode p5 = l;
ListNode p4 = p1.next;
//比较前半部分与后半部分是否相等
while(p4 != null){
if(p4.val!=p5.val){
return false;
}
p4 = p4.next;
p5 = p5.next;
}
ListNode p6 = l;
while(p6 != null){
System.out.println(p6.val);
p6 = p6.next;
}
return true;
}
参考: http://taop.marchtea.com/01.04.html