给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
示例 1:
输入:head = [1,2,2,1]
输出:true
示例 2:
输入:head = [1,2]
输出:false
解题思路
快指针一次移动两个节点,满指针一次移动一个节点。当快指针停止移动到为 null 的位置停止时,说明该链表为偶数节点,如果快指针不为 null,说明该链表为奇链表。
如果链表为奇链表,则把中间的节点归为左半部分。
随后反转以慢指针节点为起始位置的链表(反转链表)
代码如下
class Solution {
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){
if(head == null){
return null;
}
ListNode preNode = null;
ListNode currentNode = head;
while(currentNode !=null){
ListNode next = currentNode.next;
currentNode.next = preNode;
preNode = currentNode;
currentNode = next;
}
return preNode;
}
}