【LeetCode 234】算法:回文链表

题目:给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。

提示:链表中节点数目在范围[1, 105] 内; 0 <= Node.val <= 9

image


这个题目有很多种解决方法,这里介绍我认为最简单的一个方法:使用 List 集合

算法步骤:

1. 遍历链表:首先遍历整个链表,将所有节点的值存储到 List 中。

2. 比较元素:然后使用两个指针从 List 的两端开始,向中间逐个比较元素,如果所有元素都相同,则链表是回文的。

3. 返回结果:根据比较结果返回 true 或 false。

复杂度分析:

  • 时间复杂度:O (n),其中 n 是链表的长度。因为需要遍历整个链表来填充 List,然后再次遍历 List 的一半来比较元素。

  • 空间复杂度:O (n),需要额外的空间来存储链表的所有元素。

这种方法的优点是代码简单易懂,但缺点是效率较低,尤其是对于大型链表。如果对性能有较高要求,应该使用直接操作链表节点的方法。

我的 Java 代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */

class Solution {
    public boolean isPalindrome(ListNode head) {

        List<Integer> list = new ArrayList<>();

        while(head != null){
            list.add(head.val);
            head = head.next;
        }
        // i和j 初始为集合的头尾元素
        for(int i=0,j=list.size()-1; i<j; i++,j--){
            if(list.get(i) != list.get(j)){
                return false;
            }
        }
        return true;
    }
}
posted @ 2025-07-28 17:24  junjunyi  阅读(12)  评论(0)    收藏  举报