02.06、回文链表

server/2024/10/15 17:05:44/

02.06、leetcode.cn/problems/palindrome-linked-list-lcci/description/" rel="nofollow">[简单] 回文链表

1、题目描述

编写一个函数,检查输入的链表是否是回文的。

2、解题思路:

  1. 快慢指针找中点:
    • 利用快慢指针的技巧来找到链表的中间节点。慢指针 slow 每次移动一步,而快指针 fast 每次移动两步。这样,当快指针到达链表末尾时,慢指针恰好位于链表中间。
  2. 反转后半部分链表
    • 在找到中间节点后,将链表的后半部分反转。我们从 slow->next 开始反转链表,最终 newhead 将指向反转后的后半部分链表的头节点。
  3. 对比前半部分和后半部分:
    • 反转链表的后半部分后,将它与前半部分进行比较。如果所有节点值相等,则说明链表是回文的。
  4. 返回结果:
    • 如果比较过程中发现不一致,则返回 false。如果全部节点相等,则返回 true

3、代码实现与详细注释

class Solution {
public:bool isPalindrome(ListNode* head) {// 如果链表为空或只有一个节点,直接返回 trueif (head == nullptr || head->next == nullptr) {return true;}// 使用快慢指针找到链表的中间节点ListNode* fast = head;ListNode* slow = head;while (fast->next && fast->next->next) {slow = slow->next;  // 慢指针每次移动一步fast = fast->next->next;  // 快指针每次移动两步}// 将链表的后半部分反转ListNode* newhead = slow->next;  // newhead 指向后半部分的开始节点ListNode* prev = nullptr;  // 用于反转链表while (newhead->next) {ListNode* next = newhead->next;  // 保存下一个节点newhead->next = prev;  // 当前节点的 next 指向前一个节点prev = newhead;  // prev 指向当前节点,逐步推进newhead = next;  // newhead 移动到下一个节点}newhead->next = prev;  // 最后一个节点反转后,形成新的链表// 对比前半部分和反转后的后半部分是否相同slow = head;  // slow 回到链表头部while (newhead) {  // 遍历反转后的链表if (newhead->val != slow->val) {  // 如果值不相等,返回 falsereturn false;}slow = slow->next;  // 两个指针同时移动newhead = newhead->next;}// 如果链表前后部分相同,则返回 truereturn true;}
};

4、时间复杂度和空间复杂度:

  • 时间复杂度: O(n),其中 n 是链表的长度。我们遍历链表两次,一次是找到中点,另一次是进行比较。
  • 空间复杂度: O(1),因为只使用了常数额外空间。

这个方法通过快慢指针和链表反转的技巧,避免了额外的空间开销,是一个比较高效的解决方案。


http://www.ppmy.cn/server/132283.html

相关文章

【git】git add时warning:LF will replaced by CRLF

git add时warning:LF will replaced by CRLF 一,问题现象二,问题原因&解决方法 一,问题现象 二,问题原因&解决方法 这个警告的原因是 Git 在进行文件添加操作时,发现行尾结束符不一致。 在不同的…

深入理解Transformer的笔记记录(精简版本)---- ELMO->GPT->BERT

1、ELMO word embedding无法区分多义词的不同语义,其本质上是个静态的方式,所谓静态指的是训练好之后每个单词的表达就固定住了,以后使用的时候,不论新句子上下文单词是什么,这个单词的Word Embedding不会跟着上下文场景的变化而改变 ELMO根据当前上下文对Word Embed…

http大数据post与put请求

大数据请求情况下出现post请求提交出错而put请求提交不出错 一、http方法特性差异 1、请求语义和用途不同 post通常用于 创建新资源Put一般用于更新现有资源服务器对于不同的HTTP方法可能有不同的处理逻辑和优化策略。在某些情况下,服务器可能对put请求的处理更加…

数据恢复与取证: 使用 OSForensics 从未启动 Android 设备中获取数据

天津鸿萌科贸发展有限公司是 OSForensics 数据调查取证软件的授权代理商。 OSForensics 数据调查取证软件协助用户通过高性能文件搜索快速从计算机和智能设备中提取数据调查证据;通过哈希匹配、驱动器签名比较、电子邮件、内存和二进制数据识别可疑文件和活动&#…

Java基础:面向对象编程4

1 Java 访问修饰符 1.1 概述 Java 提供了四种访问权限控制: 默认访问权限(包访问权限)publicprivateprotected 类只能使用默认访问权限和 public 修饰,而变量和方法则可以使用所有四种修饰符。 1.2 修饰类 默认访问权限&…

科研绘图系列:R语言绘制中国地理地图

文章目录 介绍加载R包导入数据图a图b图c图d系统信息介绍 文章提供了绘制图a,图b和图d的数据和代码。该图展示了不同省份的物种分布情况。 加载R包 library(geojsonsf) library(sf) library(ggplot2) library(RColorBrewer) library(ggspatial) library(</

SQL之什么是窗口函数OVER

文章目录 一、OVER 的定义二、OVER 的语法三、OVER 的用法 一、OVER 的定义 OVER 用于为行定义一个窗口&#xff0c;它对一组值进行操作&#xff0c;不需要使用 GROUP BY 子句对数据进行分组&#xff0c;能够在同一行中同时返回基础行的列和聚合列。 二、OVER 的语法 OVER (…

获取京东商品历史价格接口item_history_price介绍

接口开发背景 京东作为中国知名的电商平台&#xff0c;提供了丰富的商品和服务。为了更好地满足用户和商家的需求&#xff0c;京东开放平台推出了多种API接口&#xff0c;其中“item_history_price”接口用于获取指定商品的历史价格信息。这一接口的开发背景在于帮助用户判断当…