LeetCode热题100--234.回文链表--简单

发布于:2025-05-14 ⋅ 阅读:(17) ⋅ 点赞:(0)

1. 题目

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

示例 1:
请添加图片描述
输入:head = [1,2,2,1]
输出:true

示例 2:
请添加图片描述
输入:head = [1,2]
输出:false

2. 题解

/**
 * 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> vals = new ArrayList<Integer>();

        //将链表的值复制到数组中
        ListNode currentNode = head;
        while(currentNode != null){
            vals.add(currentNode.val);
            currentNode = currentNode.next;
        }
        //使用双指针判断是否回文
        int front = 0;
        int back = vals.size() - 1;
        while(front < back){
            if (!vals.get(front).equals(vals.get(back))){
                return false;
            }
            front++;
            back--;
        }
        return true;
    }
}

3. 解析

官方回答:回文链表

  1. 1-4. ListNode currentNode head; while(currentNode != null) {…} - 将头节点赋值给变量currentNode,然后进入循环直到currentNode为null。

  2. 5.vals.add(currentNode.val); - 每次迭代时,都会将当前节点的值添加到列表vals中。
    6-7: front = 0; back = vals.size() - 1; - 初始化两个指针:前指针front和后指针back,分别从数组两端开始。

  3. 9-12. if (!vals.get(front).equals(vals.get(back))) { return false; } front++; back–; - 然后进入循环直到front >= back。如果前指针对应的值和后指针对应的值不相等,则返回false(因为这意味着链表不是回文)。否则,将前指针加1并减小后指针以向中间移动。

  4. 13.return true; - 如果while循环结束时没有找到两个位置上的元素不相同,那么该函数返回true,表示链表是回文的。

  5. 这段代码的时间复杂度为O(n),其中n是单链表中的节点数,因为我们需要遍历整个列表一次来将值复制到vals中。空间复杂度也为O(n),因为我们在创建一个新的ArrayList来存储所有的值。


网站公告

今日签到

点亮在社区的每一天
去签到