一、知识点:

遍历、链表

二、文字分析:

快慢指针的方法找到链表的中间节点,然后反转后半部分链表。最后,我们分别从链表的头部和反转后的后半部分开始遍历并比较每个节点的值,判断链表是否是回文的。

时间复杂度是 O(n),空间复杂度是 O(1)。

三、编程语言:

java

四、正确代码:

import java.util.*;

public class Solution {
    public boolean isPalindrome(ListNode head) {
        // 使用快慢指针找到链表的中间节点
        ListNode slow = head;
        ListNode fast = head;

        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }

        // 反转后半部分链表
        ListNode secondHalf = reverseList(slow);

        // 判断是否是回文链表
        ListNode p1 = head;
        ListNode p2 = secondHalf;
        while (p1 != null && p2 != null) {
            if (p1.val != p2.val) {
                return false;
            }
            p1 = p1.next;
            p2 = p2.next;
        }

        return true;
    }

    private ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode curr = head;

        while (curr != null) {
            ListNode next = curr.next;
            curr.next = prev;
            prev = curr;
            curr = next;
        }

        return prev;
    }
}