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

力扣Hot100--234.回文链表

力扣Hot100–234.回文链表

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

解题思路:
1、将链表节点值存储在列表中
2、然后使用了双指针法从列表两端向中间比较节点的值
在python中 mode_set[::-1] 表示将列表 vals反转了,所以也可以通过 mode_set==mode_set[::-1] 来判断是否是一个​​回文列表​​。这里要注意,那mode_set 就要保存节点的值,并非节点本身!!!
时间复杂度​​:O(n),遍历链表一次,比较列表一次
​​空间复杂度​​:O(n),需要额外空间存储所有节点值

常见方法:递归法和快慢指针法

代码:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def isPalindrome(self, head: Optional[ListNode]) -> bool:mode_set = []current = headwhile current:mode_set.append(current)current=current.nextleft,right = 0,len(mode_set)-1while left<right:if mode_set[left].val != mode_set[right].val:return False left = left+1right= right-1return True

递归法:
1、递归调用会沿着 current_node.next一路向下,直到链表末尾,直到末尾就会return True;
2、然后if not …判断的是​​内层递归的比较结果​​。如果内层递归在比较过程中发现了任何不匹配(即返回了 False),那么当前递归函数会立即将这个 False结果返回,不再执行后续的比较(包括 if current_node.val != self.front_pointer.val的判断),从而快速结束递归,向外部传递“不是回文”的信号。
3、如果是回文的话会返回 True,然后外部的front_pointer 会逐步向后移动。

时间复杂度​​:O(n),其中 n 是链表的长度。每个节点都会被访问一次。
空间复杂度​​:O(n),主要用于递归调用栈。递归深度与链表长度 n 成正比。

class Solution:def isPalindrome(self, head: Optional[ListNode]) -> bool:self.front_pointer = head  return self.func(head)def func(self,current_node):if current_node is not None:if not self.func(current_node.next):return False if current_node.val != self.front_pointer.val:return Falseself.front_pointer = self.front_pointer.nextreturn True

快慢指针: 重点关注!!!
1、使用快慢指针,快指针一次走两步,慢指针一次走一步。当快指针到达末尾时,慢指针位于链表中点(奇数长度)或前半部分末尾(偶数长度);
2、从慢指针指向的节点开始反转后半部分链表;
3、同时遍历前半部分和反转后的后半部分,比较每个节点的值。如果所有值都相等,则是回文链表;
4、最后将链表恢复原样–虽然题目没要求
时间复杂度是 O(n)
空间复杂度是 O(1)

class Solution:def isPalindrome(self, head: Optional[ListNode]) -> bool:if not head or not head.next:return Trueslow = headfast = headwhile fast and fast.next:slow = slow.nextfast = fast.next.next# 反转后半部分链表。slow此时位于中点或前半部分末尾,slow.next是后半部分的起点second_half_head = self.reverseList(slow)  # 反转后,second_half_head成为反转后的头节点first_half_head = head  # 前半部分的头节点仍然是head# 比较前半部分和反转后的后半部分# 注意:无论链表长度是奇是偶,反转后的后半部分长度 <= 前半部分长度p1 = first_half_headp2 = second_half_headis_palindrome = Truewhile p2:  # 只需遍历反转后的后半部分即可if p1.val != p2.val:is_palindrome = Falsebreakp1 = p1.nextp2 = p2.next# 恢复链表结构slow.next = self.reverseList(second_half_head)return is_palindromedef reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:pre = Nonecur = headwhile cur:temp = cur.nextcur.next = prepre = curcur = tempreturn pre
http://www.dtcms.com/a/395304.html

相关文章:

  • 视觉语言大模型(VLM)的产业落地:从Qwen-VL技术解析到医疗、车险行业革新
  • 零基础新手小白快速了解掌握服务集群与自动化运维(七)Nginx模块--Nginx Web服务
  • 一个硬盘选MBR 还是GPT
  • 【含文档+PPT+源码】基于GPT+SpringBoot的个人健康管理与咨询系统设计与实现
  • 【项目实战 Day5】springboot + vue 苍穹外卖系统(Redis + 店铺经营状态模块 完结)
  • 旧衣回收小程序:非技术视角下的价值重构与发展前景
  • 使用vue-i18n实现语言切换
  • 做小程序找哪家公司,解析小程序开发定制公司哪家适合你
  • 【python】python进阶——math模块
  • NHD-6108 全自动远、近光检测仪:智能高效的汽车灯光检测方案
  • 《 Linux 点滴漫谈: 一 》开源之路:Linux 的历史、演进与未来趋势
  • C#和微软System.Speech.Synthesis库实现语音合成
  • C++概述 (一)
  • 【开题答辩全过程】以 基于springboot的高校仪器共享管理系统设计和实现为例,包含答辩的问题和答案
  • 【python】FastAPI简介
  • IDEA lombok注解无效的问题,运行时提示java: 找不到符号或者方法
  • Windows 系统部署 Kronos 金融 K 线基础模型——基于 EPGF 架构
  • 010 Rust流程控制
  • MyBatisPlus快速入门:简化CRUD操作
  • 网络编程套接字(三)---简单的TCP网络程序
  • 背景建模(基于视频,超炫)项目实战!
  • ios26版本回退到ios18
  • OpenCV直方图比较:原理与四种方法详解
  • OpenCV - 图像金字塔
  • 寄存柜频繁维护还卡顿?杰和IB2-281主板:智能化升级高效省心
  • 海外短剧系统开发:多语言适配与跨地区部署的架构实践
  • JVM内存模型详解:看内存公寓如何分配“房间“
  • 【论文阅读】4D-VLA:时空视觉-语言-动作预训练与跨场景校准
  • 【论文阅读】MDM : HUMAN MOTION DIFFUSION MODEL
  • 【论文阅读】RynnVLA-001:利用人类示范改进机器人操作