跳到主要内容

简述Java实现判断链表是否为回文 ?

参考答案:

要判断一个链表是否为回文,一个常见的策略是将链表的前半部分存储在一个数组中,然后检查链表的后半部分是否与数组中的元素反向相匹配。如果它们匹配,那么链表就是回文。

以下是一个简单的Java实现:

import java.util.ArrayList;
import java.util.List;

public class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
    }

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

        List<Integer> list = new ArrayList<>();
        ListNode slow = head;
        ListNode fast = head;

        // 将链表的前半部分存储到数组中
        while (fast != null && fast.next != null) {
            list.add(slow.val);
            slow = slow.next;
            fast = fast.next.next;
        }

        // 如果链表长度为奇数,需要去掉中间节点
        if (fast != null) {
            slow = slow.next;
        }

        // 检查链表的后半部分是否与数组中的元素反向相匹配
        for (int i = list.size() - 1; slow != null; i--, slow = slow.next) {
            if (list.get(i) != slow.val) {
                return false;
            }
        }

        return true;
    }

    public static void main(String[] args) {
        ListNode head = new ListNode(1);
        head.next = new ListNode(2);
        head.next.next = new ListNode(3);
        head.next.next.next = new ListNode(2);
        head.next.next.next.next = new ListNode(1);

        System.out.println(isPalindrome(head));  // 输出 true
    }
}

这个实现的时间复杂度是O(n),其中n是链表的长度,因为我们需要遍历链表两次。空间复杂度也是O(n),因为我们需要存储链表的前半部分。

注意,这个实现假设链表中没有重复的元素。如果链表中可能有重复的元素,那么你可能需要使用一个更复杂的数据结构(如HashSet)来存储链表的元素,以便在O(1)的时间内检查一个元素是否已经出现过。