给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
1.1 快指针每次跳两个结点,慢指针每次跳一个结点,那么当快指针指向链表尾部时,慢指针刚好指向链表中间。这时,快指针重新指向头结点,而慢指针进行了反转后半部分链表,即slow指针最后指向的是链表原来的尾结点作为头结点,这时,快指针和慢指针遍历各自链表的值,如果都相同,那么返回ture。
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;
}
slow = reverse(slow);
fast = head;
while(slow != null){
if(fast.val != slow.val){
return false;
}
fast = fast.next;
slow = slow.next;
}
return true;
}
//反转链表
public ListNode reverse(ListNode head){
ListNode prep = null;
while(head != null){
ListNode next = head.next;
head.next = prep;
prep = head;
head = next;
}
return prep;
}