当前位置: 首页 > news >正文

【Leetcode】234. 回文链表

目录

  • 一、题目
  • 二、思路
    • 2.1 解题思路
    • 2.2 代码尝试
    • 2.3 疑难问题
    • 2.4 AI复盘
  • 三、解法
    • 解法1,链表转数组
    • 解法二
  • 四、收获
    • 4.1 心得
    • 4.2 举一反三

一、题目


在这里插入图片描述

二、思路


2.1 解题思路

2.2 代码尝试

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    bool isPalindrome(ListNode* head) {
        unordered_map<int,int> hash;
        while(head){
            if(hash[head->val]==0){
                hash[head->val]++;
                head=head->next;
            }else{
                hash[head->val]--;
                head=head->next;
            }
        }
        //查找哈希表中是否存在值为1的键
        if(hash.empty()){
            return true;
        }else{
            return false;
        }
    }
};

2.3 疑难问题

2.4 AI复盘

你使用 unordered_map 来记录每个值的出现次数,但这种方法无法判断链表是否是回文的。

回文链表的特点是正序和逆序的值序列相同,而你的代码只是统计了值的出现次数,无法反映顺序信息。
确实,这种哈希表只能记录出现次数,但是顺序信息不保留。

你的代码在最后检查 hash 是否为空,但这并不能判断链表是否是回文的。

三、解法


解法1,链表转数组

用数组存储链表值,然后判断数组是否回文,用双指针

class Solution {
public:
    bool isPalindrome(ListNode* head) {
        vector<int> vals;
        while (head != nullptr) {
            vals.emplace_back(head->val);
            head = head->next;
        }
        for (int i = 0, j = (int)vals.size() - 1; i < j; ++i, --j) {
            if (vals[i] != vals[j]) {
                return false;
            }
        }
        return true;
    }
};

作者:力扣官方题解
链接:https://leetcode.cn/problems/palindrome-linked-list/solutions/457059/hui-wen-lian-biao-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

解法二

用递归优雅地反向遍历,然后同时有一个从左往右的节点,来进行双指针的判断

class Solution {
    ListNode* frontPointer;
public:
    bool recursivelyCheck(ListNode* currentNode) {
        if (currentNode != nullptr) {
            if (!recursivelyCheck(currentNode->next)) {
                return false;
            }
            if (currentNode->val != frontPointer->val) {
                return false;
            }
            frontPointer = frontPointer->next;
        }
        return true;
    }

    bool isPalindrome(ListNode* head) {
        frontPointer = head;
        return recursivelyCheck(head);
    }
};

作者:力扣官方题解
链接:https://leetcode.cn/problems/palindrome-linked-list/solutions/457059/hui-wen-lian-biao-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

四、收获


4.1 心得

递归真的优雅
然后两种解法其核心都是双指针,一头一尾来进行判断,解决回文的问题

4.2 举一反三

回文的本质是双指针

在这里插入图片描述
现在刷着刷着,觉得实现代码并不重要了,因为现在AI工具就是能帮你实现,关键还是在于思路。所以要靠刷题来积累思路和想法。

相关文章:

  • 调和Django与Sql server2019的关系
  • 【工具】huggingface 模型下载过程
  • Redis主从集群和哨兵集群
  • Go语言的负载均衡
  • 电子病历系统如何设计?
  • MySQL 性能优化:索引优化 + 读写分离 + Redis 缓存,TPS 提升 175% 实战解析
  • 生成式人工智能爆发:未来“人工”会被取代吗?
  • 【ARM】MDK-STM32g0xx.h文件与Define规则记录
  • C语言中qsort函数的详解,以及模拟
  • 数据通信与计算机网络——绪论
  • Spring组件初始化扩展点:BeanPostProcessor
  • CMake学习笔记(二):变量设值,源文件/文件查找
  • 为什么在域名注册后还需要进行解析?
  • 大模型时代:主流训练、微调、推理与部署框架深度解析及对比
  • Spring设计模式 八股速记 高层模块底层模块 依赖倒置原则 开闭原则 接口隔离原则
  • 洛谷每日1题-------Day22__P1421 小玉买文具
  • 技术债务的隐患:何时重构,何时妥协?
  • 【认知框架重构】
  • 【R语言】FetchData函数:处理单细胞数据的灵活高效工具
  • 实验篇| Nginx环境搭建-安全配置
  • 新疆多地市民拍到不明飞行物:几秒内加速消失,气象部门回应
  • 首映|《星际宝贝史迪奇》真人电影,不变的“欧哈纳”
  • 篮球培训机构东方启明星被指停摆,家长称已登记未退费用超百万
  • 国家防汛抗旱总指挥部对15个重点省份开展汛前实地督导检查
  • 俄乌官员即将在土耳其会谈,外交部:支持俄乌开启直接对话
  • 外交部介绍对巴西、阿根廷、智利、秘鲁、乌拉圭等5国试行免签政策