请判断一个链表是否为回文链表。
示例 1:
输入: 1->2 输出: false
示例 2:
输入: 1->2->2->1 输出: true
思路:首先找到链表的中间结点,从中间结点开始翻转链表得到两条新链表,比较两条链表的值是否一样。
/**
* 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;
}
ListNode mNode=findMiddle(head);
mNode=mNode.next;
mNode=reverseList(mNode);
while(head!=null&&mNode!=null) {
if(head.val!=mNode.val) {
return false;
}
head=head.next;
mNode=mNode.next;
}
return true;
}
//找到链表的中间结点
public ListNode findMiddle(ListNode head) {
if(head==null||head.next==null) {
return head;
}
ListNode p1=head;
ListNode p2=head;
ListNode temp=head;
int i=0;
while(p1!=null&&p2!=null) {
temp=p1;
p1=p1.next;
p2=p2.next; i++;
if(p2!=null) {
p2=p2.next; i++;
}
}
return temp;
}
/**
* 反转链表
* @param head
* @return
*/
public ListNode reverseList(ListNode head) {
ListNode pre=head;
ListNode temp=head;
ListNode cur=head.next;
while(cur!=null) {
temp=cur.next;
cur.next=pre;
pre=cur;
cur=temp;
}
head.next=null;
return pre;
}
}