回文链表

设计一种方式检查一个链表是否为回文链表。
样例
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));
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值