请判断一个链表是否为回文链表。
首先使用快慢指针,找到链表的中间节点,然后使用leetcode206
的方法反转链表,比较反转后的链表与前半部分是否相等
/**
* 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 fast = head;
ListNode slow = head;
while (fast.next != null&& fast.next.next != null) {
fast = fast.next.next;
slow = slow.next;
}
slow = reverseList(slow.next);
while(slow != null) {
if (head.val != slow.val) {
return false;
}
head = head.next;
slow = slow.next;
}
return true;
}
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) return head;
//先递归找到到链表的末端结点,从后依次反转整个链表
ListNode reverseHead = reverseList(head.next);
//再将当前节点设置为后面节点的后续节点
head.next.next = head;
head.next = null;
return reverseHead;
}
}