码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 剑指 Offer II 027. 回文链表


    日常刷题中🐵

    GitHub链接😉

    diwei00 (github.com)icon-default.png?t=M5H6https://github.com/diwei00刷题代码都在Exercise库中提交

    LeetCode链接😁

    剑指 Offer II 027. 回文链表 - 力扣(LeetCode)icon-default.png?t=M5H6https://leetcode.cn/problems/aMhZSa/

    题目😯

    给定一个链表的 头节点 head ,请判断其是否为回文链表。

    如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。

    示例1

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

    示例2

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

    题目解析🤨

         首先,回文链表的判断要用第一个节点数据和最后一个节点数据进行比对,然后在用第二个节点和倒数第二个节点数据比对,以此类推。因为这是单链表,他不像顺序表那样可以随机访问数据,只能从前往后遍历链表。

         分析题目发现,数据的比对是链表的前半部分和后半部分进行比较,所以我们需找到链表的中间节点。由于进行比对是前半部分节点数据和后半部分节点数据,所以考虑反转后半部分链表。

         这里找链表的中间节点,用的是快慢指针法,快指针一次走两步,慢指针一次走一步。区分奇偶个数节点链表,当快指针遍历完链表时,慢指针刚好在链表的中间节点。

         这里反转链表,用的是三指针法,为的是反转完可以找到下一个节点。

    这里的两个思路在这篇博客中有详细介绍。

    反转链表(AND)链表的中间结点_小小太空人w的博客-CSDN博客icon-default.png?t=M5H6https://blog.csdn.net/weixin_62353436/article/details/124332827?spm=1001.2014.3001.5501

    代码实现(有详细注释)

    1. bool isPalindrome(struct ListNode* head)
    2. {
    3. struct ListNode* phead = head;
    4. struct ListNode* fast = head;
    5. struct ListNode* slow = head;
    6. //快慢指针找中间节点
    7. while (fast != NULL && fast->next != NULL)
    8. {
    9. fast = fast->next->next;
    10. slow = slow->next;
    11. }
    12. struct ListNode* p1 = NULL;
    13. struct ListNode* p2 = slow;
    14. struct ListNode* p3 = slow->next;
    15. //反转后半部分链表
    16. while (p2 != NULL)
    17. {
    18. p2->next = p1;
    19. p1 = p2;
    20. p2 = p3;
    21. if (p3 != NULL)
    22. {
    23. p3 = p3->next;
    24. }
    25. }
    26. //比对数据
    27. while (p1 != NULL)
    28. {
    29. if (p1->val == phead->val)
    30. {
    31. p1 = p1->next;
    32. phead = phead->next;
    33. }
    34. else
    35. {
    36. return false;
    37. }
    38. }
    39. //全部数据都相等
    40. return true;
    41. }

    小结😆

        对于链表的操作,要考虑访问数据是不同于顺序表的,所以思路会有一定的差异。我们需大量的去刷题,锻炼编程思维, 相信坚持下去会有不一样的收获🤨。 

  • 相关阅读:
    你知道哪几种Java锁?分别有什么特点?
    如何设置代理ip服务器地址
    洛谷P6586 蒟蒻火锅的盛宴
    2023.11.12使用flask对图片进行黑白处理(base64编码方式传输)
    树状数组:leetcode307 区域和检索
    11.Spring security跨域问题
    前端 | 如何使用 css 实现居中效果
    特征匹配算法GMS(Grid-based Motion Statistics)理论与实践
    Spring:IOC/DI注解开发(7)
    滤波器基础知识介绍
  • 原文地址:https://blog.csdn.net/weixin_62353436/article/details/125430835
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号