思路:
for example:
[1,1,3,1]
1.用一个fast和slow指针分别指向表头,
1->1->3->1
sf指针
2.快速移动fast指针到表尾,slow指针到表中
1->1->3->1->null
s f
3.用fast指针指向表头,在反转slow开始指向的其余链表
1->1 null<-3<-1
f s
4。再开始从fast和slow指针开始比较元素的值
1->1 null<-3<-1
f s
so,code如下:
public boolean isPalindrome(ListNode head) {
ListNode fast=head,slow=head;
while(fast!=null && fast.next!=null )
{
fast=fast.next.next;
slow=slow.next;
}
if(fast!=null)//对于链表中的元素是奇数个
{
slow=slow.next;
}
fast=head;
slow=reverse(slow);
while(slow!=null)
{
if(fast.val!=slow.val)
return false;
fast=fast.next;
slow=slow.next;
}
return true;
}
public ListNode reverse(ListNode head)//反转链表
{
ListNode newhead=null;
while(head!=null)
{
ListNode next=head.next;
head.next=newhead;
newhead=head;
head=next;
}
return newhead;
}