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

力扣热题100之回文链表

题目

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
在这里插入图片描述

代码

方法一:

将链表值复制到数组中,在数组中判断是否是回文列表

# 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:cur_node=headhead_list=[]while cur_node:head_list.append(cur_node.val)cur_node=cur_node.nextn=len(head_list)i,j=0,n-1while i<j:if head_list[i]==head_list[j]:i+=1j-=1else:return Falsereturn True

方法二:递归

利用递归回溯过程与从前往后遍历的节点的值进行比较

# 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:self.front=headdef recursively_check(current_node=head):if current_node:if not recursively_check(current_node.next):#递归到最后一个节点,开始回溯return False # 回溯的过程中出现一次False就结束代码if self.front.val != current_node.val:#以下就是回溯时的内容return Falseself.front=self.front.nextreturn Truereturn recursively_check()

方法三:

这个方法的重点就是将这段链表的前后两个部分分开,并翻转后半部分,进行比较

# 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:first_half_end = self.end_of_first_half(head)second_half_start = self.reverse_list(first_half_end.next)result=True first_position = headsecond_position = second_half_startwhile result and second_position:if first_position.val!=second_position.val:result=Falsefirst_position=first_position.nextsecond_position=second_position.nextfirst_half_end.next=self.reverse_list(second_half_start)return resultdef end_of_first_half(self,head):fast=headslow=headwhile fast.next and fast.next.next:# 确保快指没有针到最后一个节点,并且快指针能够移动两步# 这段代码奇数长度链表:slow 指向正中间的节点。偶数长度链表:slow 指向前半部分的最后一个节点fast=fast.next.nextslow=slow.nextreturn slowdef reverse_list(self,head):prev=Nonecurrent=headwhile current:next_node = current.nextcurrent.next=prevprev=currentcurrent=next_nodereturn prev

相关文章:

  • CPU的基本认识
  • 企业数字化转型第二课:接受不完美(1/2)
  • 2025最新出版 Microsoft Project由入门到精通(二)
  • springboot国家化多语言实现
  • Python中的global与nonlocal关键字详解
  • AV1中的维纳滤波器
  • 数据管道的解耦艺术:Dagster I/O管理器实现存储与逻辑分离
  • Android开发-文本显示
  • 数通HCIE的通过率怎么样?
  • Linux 内核学习(7) --- 字符设备驱动
  • 蓝牙L2CAP协议概述
  • 前端日常 · 移动端网页调试
  • C——函数递归
  • Vue 项目中二维码生成功能全解析
  • 数智管理学(八)
  • 今日行情明日机会——20250507
  • MySQL 联合查询的使用教程
  • 【C/C++】ARM处理器对齐_伪共享问题
  • 【多种不同提交方式】通过springboot实现与前端网页数据交互(非常简洁快速)
  • 计算机硬件(南桥):主板芯片组FCH和PCH的区别
  • 上海优化营商环境再攻坚,企业和机构有哪些切实感受?
  • 国家发改委:目前有的核电项目民间资本参股比例已经达到20%
  • AI聊天机器人涉多起骚扰行为,专家呼吁加强伦理设计与监管
  • 这个五月,有三部纪录电影值得一看
  • 央行:今日起下调再贷款利率0.25个百分点
  • 吴清:加强监管的同时传递监管温度,尽力帮助受影响企业应对美加征关税的冲击