给你一个单链表的头节点 head
,请你判断该链表是否为回文链表。如果是,返回 true
;否则,返回 false
。
示例 1:
输入:head = [1,2,2,1] 输出:true
示例 2:
输入:head = [1,2] 输出:false
双指针:
先创建一个快指针和一个慢指针 同时移动 当快指针移动到最后的同时,慢指针刚好移动到中间。
如果是奇数,则将中间的元素给到左边的。将右边的链表反转
然后将快指针移到左边链表的头,依次进行比较
代码:
public boolean isPalindrome(ListNode head) {
if(head == null) return false;
ListNode k = head;
ListNode m = head;
while(k!=null && k.next!=null){
k = k.next.next;
m = m.next;
}
if(k != null){
m = m.next;
}
// 反转m
m = reverse(m);
k = head;
while(m != null ){
if(k.val!=m.val){
return false;
}
k = k.next;
m = m.next;
}
return true;
}
public ListNode reverse(ListNode head){
ListNode preNode = null;
while(head != null){
ListNode next = head.next;
head.next = preNode;
preNode = head;
head = next;
}
return preNode;
}