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

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

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

难啊楠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值