设计一种方式检查一个链表是否为回文链表。
样例
1->2->1 就是一个回文链表。
挑战
样例
1->2->1 就是一个回文链表。
挑战
O(n)的时间和O(1)的额外空间。
import java.util.Scanner;
/**
* 设计一种方式检查一个链表是否为回文链表。
样例
1->2->1 就是一个回文链表。
挑战
O(n)的时间和O(1)的额外空间。
* @author Dell
*
*/
public class Test223 {
public static boolean isPalindrome(ListNode head)
{
if(head==null||head.next==null)
return true;
ListNode temp=new ListNode(-1);
temp.next=head;
ListNode result=new ListNode(-1);
ListNode p=temp.next;
while(p!=null)
{
ListNode temp1=new ListNode(p.val);
temp1.next=result.next;
result.next=temp1;
p=p.next;
}
ListNode r=result.next;
ListNode q=temp.next;
while(r!=null&&q!=null)
{
if(r.val!=q.val)
return false;
r=r.next;
q=q.next;
}
return true;
}
public static boolean isPalindrome1(ListNode head)
{
if(head==null||head.next==null)
return true;
ListNode mid=findmid(head);
ListNode p=mid.next;
mid.next=null;
ListNode q=null;
while(p!=null)
{
q=p.next;
p.next=mid.next;
mid.next=p;
p=q;
}
ListNode r=head;
ListNode t=mid.next;
while(t!=null)
{
if(r.val!=t.val)
return false;
r=r.next;
t=t.next;
}
return true;
}
public static ListNode findmid(ListNode head)
{
ListNode slow=head;
ListNode fast=head;
while(fast.next!=null&&fast.next.next!=null)
{
slow=slow.next;
fast=fast.next.next;
}
return slow;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
ListNode list=new ListNode(-1);
ListNode p=list;
int n=sc.nextInt();
for(int i=0;i<n;i++)
{
ListNode temp=new ListNode(sc.nextInt());
p.next=temp;
p=p.next;
}
System.out.println(isPalindrome1(list.next));
}
}