【力扣】回文链表

【力扣题解 Day 17】234. 回文链表 力扣算法打卡记录 阅读详情

 🔥博客主页: 我要成为C++领域大神

🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】

❤️感谢大家点赞👍收藏⭐评论✍️

本博客致力于分享知识,欢迎大家共同学习和交流。

10f3f804036d438784915f2c6f94fb5d.gif

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

示例 1:

 

fdafeed49bbcf501b5f29b428ec65114.png

输入:head = [1,2,2,1]
输出:true

示例 2:

 

d18260c03019997247111a5878541b70.png

输入:head = [1,2]
输出:false

方法一:双端队列比较首尾

流程:

1、创建一个deque类型的容器,将链表节点元素值依次入队
2、比较队列首尾元素值是否相同
①相同,首尾出队,继续比较
②不相同,不是回文链表,返回false
3、若循环正常结束,队列为空,是回文链表,返回true

代码实现:

/**
 * 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) {
        deque<int> d;
        while (head != nullptr) {
            d.push_back(head->val);
            head = head->next;
        }

        while (d.size() > 1) { // 只有剩余一个或零个元素时停止循环
            if (d.front() != d.back()) {
                return false;
            }
            d.pop_front();
            d.pop_back();
        }
        return true;
    }
};

方法二:折半拆分逐个比较

流程:

1、将链表从中间节点断开
2、对后一半的链表进行翻转
3、比较两个链表是否相同

代码实现:

/**
 * 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) {
        if(head == nullptr ) return true;
         ListNode *mid=FindMid(head);  
        ListNode *L1=head;
        ListNode *L2=mid->next;
        L2=reverseList(L2);
        return isSame(L1,L2);
    }
private:
    bool isSame(ListNode *headA,ListNode *headB){
        ListNode *p1=headA;
        ListNode *p2=headB;
        while(p2!=nullptr){
            if(p1->val!=p2->val)
            return false;
            p1=p1->next;
            p2=p2->next;
        }
        return true;
    }
    ListNode* reverseList(ListNode* head) {
        if(head==nullptr) return nullptr;
        ListNode *p1=nullptr;
        ListNode *p2=head;
        ListNode *p3=head->next;
        while(p3){
            p2->next=p1;
            p1=p2;
            p2=p3;
            p3=p3->next;
        }
        p2->next=p1;
        return p2;
    }
    ListNode *FindMid(ListNode *head){
        ListNode *pFast=head;
        ListNode *pSlow=head;
        while(pFast->next && pFast->next->next){
            pFast=pFast->next->next;
            pSlow=pSlow->next;
        }
        return pSlow;
    }
};

 

Windows Server 搭建ftp服务 阅读详情

相关推荐

Lm317电压源芯片制作电流源

还在找电流源芯片么?如何使用电压源芯片快速搭建电流源。

Ekko的博客 1万+

【力扣 - 回文链表】

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true;否则,返回 false。链表中节点数目在范围[1, 100000] 内。

六月悉茗的博客 1529

ollama接入图像识别大模型

ollama接入图像识别大模型

qq_36437991的博客 2075

力扣. 回文链表

这样最后fast指针到末尾了,slow的节点就是中间节点(但是这里为什么是判定fast.next 和 fast.next.next不为空有点疑惑)然后使用list将值复制完成之后,就是普通的回文串判断逻辑,左右双指针进行判断,碰见不相同的字母返回false。所以我们可以采取从中间翻转链表之后,然后比较后半部分翻转之后链表的值和前半部分的值是否对应相等。这题目 最简单的方法就是利用数组(list),将回文链表中的值传入数组(list)进行复制。翻转链表就是基础的翻转链表的力扣题。

m0_56957320的博客 223

代码详解——Transformer

对于一个序列,在 time_step 为 t 的时刻,我们的解码输出应该只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。当 Decoder 的输入矩阵和 Mask 矩阵输入矩阵包含 “ I have a cat” (0, 1, 2, 3, 4) 五个单词的表示向量,Mask 是一个 5×5 的矩阵。然后判断是否传入的mask, 如果有mask (mask参数值不为None),则把mask为0的位置,将对应位置的attn的值设为无穷小的负数。可以发现得到的输出和输入的K,Q,V的大小相同。

zyw2002的博客 7213

MinerU 系列教程 | 第二课:快速上手 -- 安装与第一次解析

本篇教程作为的第二课,将带你从零完成 MinerU 的环境搭建、模型下载,并成功运行第一次文档解析。上一课我们从宏观视角认识了 MinerU,本课开始正式动手实践。

weixin_43674738的博客 301

【leetcode】力扣热门之回文链表【简单难度】

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

小马哥的博客 1010

计算机实战分享3:森林火灾预测分析可视化机器学习预测-完整数据代码-可直接运行

计算机实战分享3:森林火灾预测分析可视化机器学习预测-完整数据代码-可直接运行

604

算法系列-力扣234-回文链表

题目说明:给你一个单链表的头结点,你需要判断这个链表是否是回文链表。回文链表指不论从头部开始遍历链表,还是从尾部反过来遍历的结果是一样的,示例,链表 A -> B -> A ,两种遍历的结果都是A,B,A是回文链表。反例,链表 A -> B -> C,正序遍历是A,B,C,倒序遍历是C,B,A,因此就不是回文链表。

kikibingo的专栏 546

NSIS教程(8): 基于第三方界面库的安装包界面

前面的几篇文章介绍了NSIS的传统界面的安装包和现代界面的安装包的制作方法,也提到了NSIS支持自定义页面(即使用page custom)的特性,自定义页面需要用户自己创建对话框、控件、添加控件响应等等,虽然NSIS提供了nsDialogs.nsh来支持这些功能,但使用起来还是不太方便(需要专门了解这个插件诸多用法),而且不够灵活,所以本文介绍一种终极的自定义界面的安装包解决方案,即完全使用第三方

while(1) { smile(); } 9万+

【3天快速入门WPF】从小白到新手入门教程

嘿,小伙伴们!如果你已经有一定的C#开发基础,但想快速掌握WPF开发,达到企业级水准,那接下来的这个三天快速入门计划绝对适合你!虽然听起来有点挑战,但别担心,只要跟着这个高强度、结构化的学习计划,你一定能搞定它。首先,我们得搞清楚,WPF的核心知识点到底有哪些。要想达到企业级开发水准,XAML、数据绑定、MVVM、控件使用、命令系统、样式模板这些统统都得拿下。听起来是不是有点多?别急,我们把任务分解到三天里,每天安排合理的内容,保证理论和实践相结合,让你学得扎实又高效。

Zy100Papa的博客 1422

【链表题】——回文链表

如果直接反转整个链表然后与原链表对比的方法,虽然在反转过程中只使用了几个额外的指针变量,但反转后的链表确实占用了与原链表相同的空间。这个问题是因为在比较的时候,没有考虑到原始链表和反转后的链表在比较过程中需要同时移动,而不是只移动一个链表。在这个版本中,只在比较循环中检查反转后的链表是否为空,确保原始链表和反转后的链表同时移动并进行比较。在反转链表过程中,生成了一个与原链表长度相同的反转后的链表,所以空间复杂度为。在这个实现中,反转链表后占用了额外的空间来存储反转后的链表,所以空间复杂度为。

weixin_47868976的博客 1309

AI 学术科研与论文写作的正确打开方式!不套提示词模板,靠这个思路完美实现人机共创

真正的“人机共创”,也就是AI引导我思考的过程,如果你想用你的模糊需求,去写出专业化的学术内容,那是不可能的。对想快速完成某些学术任务的同仁来说,我们完全不用去抠提示词的细节,直接用魔法打败魔法,设计一段优化提示词的结构化提示词(提示词架构),辅助优化你的模糊需求。创建好之后,可以对它提你的任何模糊学术需求,比如写论文、写综述、学术润色等等,它绝不会直接帮你生成,而是先搞懂你的真实意图。以上整个流程,完全没有一句废话,先是思考,再是向你提问弄懂你的意图,最后整合你给出的关键信息,直接优化你给的模糊需求。

智能AI让学术科研更容易 477

【简单】力扣算法题解析LeetCode234:回文链表

题目要求判断单链表是否为回文结构。解法采用快慢指针找中间节点,反转后半部分链表,再比较前后部分。关键步骤包括: 快慢指针定位中间节点; 反转后半部分链表; 双指针遍历比较节点值; 恢复原链表结构。 时间复杂度O(n),空间复杂度O(1)。代码实现通过边界处理、链表反转和恢复确保高效性。 核心优化:快慢指针+局部反转,避免额外空间消耗。

ylumwd的博客 1541

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

234. 回文链表 - 力扣(LeetCode)

然后将反转后的链表与前半段未反转的链表做比较,直到中间节点如果对应相同,则为回文数。将反转后的后半部分链表与原链表的前半部分逐个节点比较,如果所有对应节点的值都相等,则链表是回文的;fast 和 fast.next 都存在(fast 指向 1,fast.next 指向 2)。从中间节点开始,逐个将节点从原链表中取出,并将其插入到新链表的头部,从而实现反转。此时,反转后的后半部分链表为 1 -> 2 -> 3,pre 指向节点 1。此时,slow 指向节点 3,fast 指向节点 1。

q1111111da的博客 826

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

leetcode力扣234题回文链表暴力解法

【代码】leetcode力扣234题回文链表暴力解法。

xiaohao0001abc的博客 268

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【力扣刷题实战】回文链表

文章目录目录力扣题目:回文链表题目描述 示例 1:示例 2:解题思路问题理解算法选择具体思路题目要点完整代码(C语言)兄弟们共勉 !!! 每篇前言

2401_85548793的博客 1087

《LeetCode力扣练习》第234题 回文链表 Java

《LeetCode力扣练习》第234题 回文链表 Java 一、资源 题目: 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head = [1,2,2,1] 输出:true 示例 2: 输入:head = [1,2] 输出:false 提示: 链表中节点数目在范围[1, 105] 内 0 <= Node.val <= 9 进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

XRT_knives的博客 390

LeetCode 234. 回文链表(Java)

回文链表 请判断一个链表是否为回文链表。 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/palindrome-linked-list 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 ...

nuts_and_bolts的博客 161

LeetCode 234. 回文链表

欢迎关注我的 力扣github仓库,有JavaScript和C++两个版本,每日更新 写在前面: 这题好无语,dev跑的结果和oj平台不一样,害我调试那么久 我是通过快慢指针+后半段反转的方式解决的,也可以快慢指针+前半段反转或者快慢指针+栈 等等方式 C++: /** * Definition for singly-linked list. * struct ListNode { * ...

Gary的博客 267

回文链表力扣234

emplace_back` 和 `push_back` 都是 C++ 中 `std::vector` 的成员函数,用于向容器尾部添加元素,但它们在实现方式和性能上有显著区别:1. 参数传递方式接受一个已构造好的对象(拷贝或移动),然后将该对象添加到 `vector` 末尾。// 拷贝构造// 移动构造(如果 Foo 支持移动语义)

2301_81834780的博客 646

【LeetCode】234. 回文链表

为了养成创作习惯,从今天起开始刷力扣了,只刷简单和中等难度的题,分类刷,这个月就先刷链表题,从简单的开始按着顺序刷,一天一道,养生做法。为了锻炼一下自己,决定用 C 来写,据说是受苦,不过一天一道无所谓了。

m0_62051288的博客 260

力扣 234 回文链表

快慢指针 找中点(注意奇偶) 分开 反转后半链 比较(以后半链为主) class Solution { public: bool isPalindrome(ListNode* head) { ListNode *p=new ListNode(-1);//预先指针 ListNode *fast=p; ListNode *low=p; ...

qq_40519283的博客 377

234.力扣LeetCode_回文链表

本文介绍了判断单链表是否为回文结构的算法,主要步骤包括:1)使用快慢指针找到链表中间节点进行分割;2)反转后半段链表;3)同时遍历前半段和反转后的后半段进行值比较;4)还原链表结构。算法通过三指针法实现链表反转,确保空间复杂度为O(1),时间复杂度为O(n)。在判断过程中会保留原链表结构,比较失败时立即恢复链表,最后无论是否回文都会还原链表。这种方法高效且不破坏输入数据,适用于需要判断链表回文性的场景。

2401_82472941的博客 424

力扣234.回文链表

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

2501_93509832的博客 891

力扣 234. 回文链表

​ 本文仅仅简单讲解了《234. 回文链表》这一题目,对链表和数组结合应用有了一定的掌握 ​

m0_51787573的博客 649
上一篇: 【Linux】C语言系统函数实现cat命令
下一篇: 【Linux】C语言系统函数实现阻塞和非阻塞读取终端
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值