关阿姨带你横扫LeetCode系列之回文链表|Java 刷题打卡

274 阅读2分钟

关阿姨正在参加「Java主题月 - Java 刷题打卡」,详情查看 活动链接

首先跟大家阐明一点就是,每道算法题都有多种解法,我们只讲LeetCode上几种优秀的解题思路~,希望

可以帮助到大家,那我们先来看下题目描述吧~

一、题目描述:

请判断一个链表是否为回文链表。 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

二、思路分析:

我们可以发现,回文链表即链表两端对应的位置的值相同,因此我们可以使用双指针法来比较两端的元素,并向中间移动,然而链表中只保存一个值和指向下一个节点的指针,要想得到某个特定索引位置的值,需要O(N)的时间,而数组列表使用数组存储,我们可以通过索引在O(1) 的时间访问列表任何位置的值;因此我们可以将链表的值复制到数组列表中,再使用双指针法判

三、代码实现

public boolean isPalindrome(ListNode head) {
        //这里使用list,使用了list是有序的特性
        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;
    }

刷题总结

如果大家还有其他解题思路,只要能实现要求,都是没问题的,条条大路通罗马,不要仅仅局限于我讲的这种解法哈~,优秀的思路和代码更具备学习意义,我们一起加油吧