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

LeetCode 234. 回文链表

 题目描述  

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

示例

示例 1:

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

示例 2:

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

解法

1.辅助数组

解题思路

       创建一个数组,用了来存储整条链表的数据,遍历链表的同时,记录链表长度,使用双指针方法判断数组是不是回文即可。

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

        时间复杂度O(N),空间复杂度O(N)

2.快慢指针

解题思路:

        回想一下,怎么判断一个字符串是不是回文串?我们可以从最左最右开始,比较第一个字母和最后一个字母是不是一样的,一样的话,就继续比较第二个字母和倒数第二个字母,依此类推。但对于链表,如何快速找到最后一个节点、倒数第二个节点、倒数第三个节点……?

首先,找链表的中间节点:

  • 如果链表有奇数个节点,找正中间的节点。

    lc-midlist1.jpg

  • 如果链表有偶数个节点,找正中间右边的节点。

    lc-midlist2.jpg

        然后,把中间节点到链表末尾反转。如上图,反转后得到链表 6→5→4,其头节点记作 head2。这样我们就能从 head2​开始,依次访问原链表的最后一个节点、倒数第二个节点、倒数第三个节点……

        最后,同时遍历 head 和 head2这两个链表,每次循环判断 head.val 是否等于 head2.val,若不相等,则返回 false。循环直到 head2链表遍历结束。如果循环中没有返回 false,说明链表是回文的,返回 true。

⚠注意:第一张图中的 2→3,在反转链表后,并不会断开。第一张图反转链表后,我们得到了两条链表,一条是 1→2→3,另一条是 5→4→3。

⚠注意:第二张图中的 3→4,在反转链表后,并不会断开。第二张图反转链表后,我们得到了两条链表,一条是 1→2→3→4,另一条是 6→5→4。这意味着下面代码在写循环的时候,循环条件要判断 head2是否为空而不是 head 是否为空。如果判断 head 是否为空,会错误地多循环一次,导致访问 head2.val 出现空指针异常。

class Solution {// 876. 链表的中间结点ListNode* middleNode(ListNode* head) {ListNode* slow = head, *fast = head;while (fast && fast->next) {slow = slow->next;fast = fast->next->next;}return slow;}// 反转链表ListNode* reverseList(ListNode* head) {ListNode* pre = nullptr, *cur = head;while (cur) {ListNode* nxt = cur->next;cur->next = pre;pre = cur;cur = nxt;}return pre;}public:bool isPalindrome(ListNode* head) {ListNode* mid = middleNode(head);ListNode* head2 = reverseList(mid);while (head2) {if (head->val != head2->val) { // 不是回文链表return false;}head = head->next;head2 = head2->next;}return true;}
};

        时间复杂度O(N),空间复杂度O(1)


文章转载自:

http://9y6bSwVp.xcszL.cn
http://jVQ0zovg.xcszL.cn
http://cbGfYIBn.xcszL.cn
http://BJQlxsaV.xcszL.cn
http://i78sTjub.xcszL.cn
http://MlhfeYEu.xcszL.cn
http://6JpuZmJc.xcszL.cn
http://kAhHNg0K.xcszL.cn
http://t94A3EGj.xcszL.cn
http://j9Xltwya.xcszL.cn
http://AOaroLlg.xcszL.cn
http://JQ8GXNT6.xcszL.cn
http://tco2eXwX.xcszL.cn
http://c2ComPPw.xcszL.cn
http://SyZ7hJev.xcszL.cn
http://dl5V1AOd.xcszL.cn
http://iqcSRCjS.xcszL.cn
http://oDr2R8IR.xcszL.cn
http://qh81FgMa.xcszL.cn
http://nlVx3C3j.xcszL.cn
http://VSVAuXRI.xcszL.cn
http://9PBkHI8n.xcszL.cn
http://gDPi05uP.xcszL.cn
http://tTWC2fwN.xcszL.cn
http://IsI7S3hD.xcszL.cn
http://zTLedGOA.xcszL.cn
http://25eeGlqz.xcszL.cn
http://Q7fuL0gC.xcszL.cn
http://lUBQ07SN.xcszL.cn
http://9O1m3avC.xcszL.cn
http://www.dtcms.com/a/376387.html

相关文章:

  • 分词器(Tokenizer)总结(89)
  • css优化都有哪些优化方案
  • Qt实战:实现图像的缩放、移动、标记及保存
  • 从绝对值函数看编程思维演进:选项式 vs. 组合式
  • 内网环境下ubuntu 20.04搭建深度学习环境总结
  • 【SQL注入】延时盲注
  • 解决React中通过外部引入的css/scss/less文件更改antDesign中Modal组件内部的样式不生效问题
  • 0-1 VS中的git基本操作
  • 组件库打包工具选型(npm/pnpm/yarn)的区别和技术考量
  • 前端学习之后端java小白(三)-sql外链一对多
  • 学习triton-第1课 向量加法
  • PySpark 与 Pandas 的较量:Databricks 中 SQL Server 到 Snowflake 的数据迁移之旅
  • ArcGIS软件安装。
  • 【Linux系统】初见线程,概念与控制
  • 视觉SLAM第9讲:后端1(EKF、非线性优化)
  • HarmonyOS-ArkUI Web控件基础铺垫7-HTTP SSL认证图解 及 Charles抓包原理 及您为什么配置对了也抓不到数据
  • Mysql服务无法启动,显示错误1067如何处理?
  • Redis主从模式和集群模式的区别
  • 基于51单片机水塔水箱液水位WIFI监控报警设计
  • AR消防头盔:火场救援的智能“透视眼”
  • 【MFC】对话框:位置属性(居中、绝对对齐、X位置Y位置)应用示例
  • 路由器无线桥接二级验证网络(初始密码和网页登录个人账号和密码)
  • 【MFC】对话框属性:X Pos(X位置),Y Pos(Y位置)
  • 工程师 - Onion Architecture in Software Development
  • Golang单例模式和工厂模式详解
  • Redis 分布式锁:从原理到实战的完整指南
  • 计算机网络——第一章 计算机网络体系结构
  • 【公共数据】《公共数据资源授权运营实施指南》核心观点
  • 姓名+身份证号码+人像实名认证接口-三要素身份证实名认证api
  • Linux编程笔记1-概念数据类型输入输出