趁室友吃鸡,刷一道回文链表

⭐️LeetCode每日一题⭐️


  • ? 博客主页:南七的博客主页
  • ?期待得到大家的点赞?收藏?留言?和关注?
  • ? 持续刷题,每日一题 02
  • ?博主水平有限,如果发现有不对的地方,希望大佬们指正!
  • ?放弃很容易,但坚持一定很酷,人生一次,怎愿甘拜下风!
  • ?来源:LeetCode 剑指 Offer II 027. 回文链表
  • 系列文章持续更新中…
    ? 1.挡住众人的两数之和…


题目描述
给定一个链表的 头节点 head ,请判断其是否为回文链表。
如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。

示例 1:
在这里插入图片描述
输入: head = [1,2,3,3,2,1]
输出: true
示例 2:

在这里插入图片描述
输入: head = [1,2]
输出: false


提示:
链表 L 的长度范围为 [1, 105]
0 <= node.val <= 9


?博主的脑回路:

刚拿到题目,啊,回文?啊,链表?满脑子就在那里想如何把链表拆分两半比较,不过怎么想也觉得不对。此时脑海中冒出一个想法,因为以前做过一个用数组的方式实现的判断回文数的题目,链表不好操作,那我把他转换成数组不就行了嘛,然后把链表的值存放在数组中,只要对数组从两头遍历就可以了。啊啊啊啊,真是太激动了!竟然第一次独立的想出解法。果然,刷题还是有很大帮助的。

闲话少说,步入正题,让我们对该题进行仔细的分析


?判断数组是否回文相对于判断链表是否回文是相对简单的。该链表是一个单向链表,只能从头结点依次向后访问,如果我们想要比较第一个结点和最后一个结点是很困难的。但是,我们可以很方便的访问到数组中任一索引的值,并且访问每一个元素的时间复杂度都是O(1)的。那么,将链表转化为数组来判断是否回文就简便了很多。对于数组,我们只需要从两端向中间遍历即可,一次比较两端的数据的值是否相等,如果存在不相等的情况就输出为false,否则就为true。

?题解:

/**
 * 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<Integer>();
        ListNode temp = head;
        while(true){
            if(temp == null){
                break; 
            }
            list.add(temp.val);
            temp = temp.next;
        }
        //从两头遍历
        for(int i=0;i<=list.size()/2;i++){
            if(!(list.get(i).equals(list.get(list.size()-1-i)))){
                 return false;
            }
        }
        return true;
    }
}

?官方解答:

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;
    }
}

在这里插入图片描述
?期待得到大家的点赞?收藏?留言?和关注?


版权声明:本文为qq_46375925原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。