使用快慢指针来判断回文链表。

首先,使用快慢指针找到链表的中间节点。快指针每次移动两个节点,慢指针每次移动一个节点,当快指针到达链表末尾时,慢指针刚好到达链表的中间位置。

然后,将链表的后半部分进行反转。

最后,从链表的头部和中间位置开始同时遍历链表,比较对应位置的节点的值是否相等。如果所有节点的值都相等,则链表为回文链表;否则,链表不是回文链表。

以下是具体的Java代码实现:

public class PalindromeLinkedList {
    public boolean isPalindrome(ListNode head) {
        if (head == null || head.next == null) {
            return true;
        }

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

        ListNode secondHalfHead = reverseList(slow.next);
        ListNode p1 = head;
        ListNode p2 = secondHalfHead;
        while (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 nextTemp = curr.next;
            curr.next = prev;
            prev = curr;
            curr = nextTemp;
        }
        return prev;
    }
}

其中,ListNode是表示链表节点的类,其定义如下:

class ListNode {
    int val;
    ListNode next;

    ListNode(int val) {
        this.val = val;
    }
}

需要注意的是,该方法会修改原始链表的结构,如果不允许修改原始链表,可以先将链表复制一份再进行操作。

Java 链表回文判断:快慢指针与反转实现

原文地址: https://www.cveoy.top/t/topic/cQRi 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录