《程序员面试金典(第6版)》面试题 02.06. 回文链表(双指针(快慢指针),查找链表中间节点,反转链表)

news2024/10/5 18:32:55

题目描述

编写一个函数,检查输入的链表是否是回文的。
题目传送门~:面试题 02.06. 回文链表

示例 1:

输入: 1->2
输出: false 

示例 2:

输入: 1->2->2->1
输出: true 

进阶:

  • 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

解题思路与代码

  • 这是一道有关链表操作的题,不算特别的难。考到了链表的几个基础的操作,像是反转链表,创建一个新的链表,找到链表的中间节点,用什么方式去找。
  • 所以,需要你对链表的基础操作有一定的理解,如果你对链表的操作了熟于心的话,这道题真的是简单的不在话下,但是如果对链表只是基本了解的话,这道题还是有一丢丢难度的。

方案一:构造一条新链表(原链表的反转)之后对比

  • 这里有一点十分需要注意的是:这里的反转链表,不是在原链表上进行反转操作,而是创建一个新链表,新链表的内容是反转后的原链表,之后我们才可以继续对比操作。
  • 很多新手,或者说对链表不熟悉的人来说,很容易就 ListNode * prev = head; 开始准备反转链表了,殊不知它们已经修改了原链表的内容了,拿着修改后的原链表与自己做对比,那不就100%会出错嘛~

具体的代码如下:

class Solution {
public:
    bool isPalindrome(ListNode* head) {
        // 创建前驱节点,并且为重新创建一条新的链表(节点反转后的链表)做准备
        ListNode * tail = head;
        ListNode * newHead = nullptr;
        // 创建一条链表(节点反转后的链表)
        while(tail){
            ListNode * temp = new ListNode(tail->val);
            temp->next = newHead;
            tail = tail->next;
            newHead = temp;
        }

        // 检查两条链表是否相等,若相等则返回true,否则false
        while(newHead) {
            if(newHead->val != head->val) return false;
            head = head->next;
            newHead = newHead->next;
        }
        
        return true;
    }
};

在这里插入图片描述

复杂度分析

时间复杂度:
该代码包含两个循环。第一个循环遍历整个链表以创建一个反向链表。第二个循环遍历链表以比较原始链表和反向链表的节点。因此,总的时间复杂度为O(n) + O(n) = O(2n),在大O表示法中,我们忽略常数,所以时间复杂度为O(n)。

空间复杂度:
在创建反向链表的过程中,为每个节点分配了新的内存,所以空间复杂度为O(n),其中n为链表的长度。

方案二:优化,快慢指针!

  • 这个方案,我们使用快慢指针的方式,先找到这个链表的中间节点,紧接着,反转后半部分的链表,之后就进行对比就可以了。
  • 由于是在原链表上面进行操作,空间复杂度可以降低到O(1)
  • 快慢指针找到中间节点的好处是,不用去管奇数还是偶数节点。如果你还不理解的话,请你在纸上画一画草图,离开就能出来了。

具体的代码如下:

class Solution {
public:
    bool isPalindrome(ListNode* head) {
        if(head == nullptr || head->next == nullptr) return true;
        ListNode * slow = head;
        ListNode * fast = head;
        // 找到中间节点
        while(fast->next != nullptr && fast->next->next != nullptr){
            slow = slow->next;
            fast = fast->next->next;
        }
        // 反转后半链表
        ListNode * prev = nullptr;
        while(slow != nullptr){
            ListNode * temp = slow->next;
            slow->next = prev;
            prev = slow;
            slow = temp;
        }

        // 开始逐一对比
        while(head != nullptr && prev !=nullptr){
            if(head->val != prev->val) return false;
            head = head->next;
            prev = prev->next;
        }
        return true;
    }
};

在这里插入图片描述

复杂度分析

时间复杂度:

  • 这段代码包含三个主要步骤:找到链表的中点,反转链表的后半部分,然后比较两个半链表。这三个步骤都需要遍历链表,所以总的时间复杂度是 O(n) + O(n) + O(n) = O(3n)。但在大O表示法中,我们会忽略常数,所以最终的时间复杂度是O(n)。

空间复杂度:

  • 这段代码并没有使用额外的空间来存储链表的节点。所有的操作都是在原来链表的基础上完成的,所以空间复杂度是O(1)。

总结

这道题目是关于链表操作和回文识别的。链表是一种常用的数据结构,而回文是一种对称的特性,出现在很多算法和数据结构问题中。该题目测试了你对链表操作的理解,以及你对如何使用常量空间来解决问题的理解。

对于这道题的实际意义,可以从以下几个方面理解:

  • 对数据结构的理解和操作:链表是一种基础且常用的数据结构,理解和掌握链表的操作是非常重要的。这道题测试了你对链表的理解和操作能力。

  • 算法设计:这道题目需要你设计一个算法来解决问题。这考察了你的问题解决能力,包括如何将问题分解,如何设计算法,以及如何实现算法。

  • 空间复杂度优化:题目进阶部分要求使用 O(1) 的空间复杂度来解决问题,这就需要你考虑如何在不增加额外空间的情况下解决问题。这是对你优化代码和理解空间复杂度的一个测试。

  • 时间复杂度的理解:题目要求算法的时间复杂度为 O(n),这就需要你保证你的算法在最坏的情况下也能在线性时间内完成。

  • 实际应用:在实际的软件开发中,我们可能会遇到需要判断一个序列是否为回文的情况,例如检测字符串是否为回文。此题就可以作为实现该功能的一种思路。

所以,这道题目的主要意义在于锻炼和测试你的数据结构操作能力,算法设计能力,以及你对时间和空间复杂度的理解。同时,也可以帮助你在实际问题中更好地应用这些技巧和知识。

最后的最后,如果你觉得我的这篇文章写的不错的话,请给我一个赞与收藏,关注我,我会继续给大家带来更多更优质的干货内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/555860.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯单片机串口通信学习提升笔记——部分2

今日继续学习提升蓝桥杯国赛能力水平。 有道是:卜心事、灯花无语,百感孤单,鸳被羞展...... 梦方圆,又丛钟、声声惊断。 诗人杨玉衔孤单影只,偏偏又多遭磨难,一路坎坷...... 正如我近日来学习提升串口通信…

数据结构学习分享之链式二叉树(一)

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:数据结构学习分享⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你了解更多数据结构的知识   🔝🔝 1. 前言 在学习链式二叉树…

【Linux】shell编程—awk编辑器

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、awk编辑器1.工作流程3.常用选项 二、awk的基础用法1.输出文件中的某一列2.根据特定条件筛选数据3.按照分隔符进行切割4.在匹配到特定字符串时执行操作5.BEGIN打…

chatgpt赋能Python-pythonwxpy

Python的wxpy模块:一款强大的微信机器人框架 在当今数字时代,微信已经成为了大家日常生活中不可缺少的应用。wxpy是一款使用Python语言的微信机器人框架,可以帮助用户实现诸如自动回复、消息提醒、定时发送消息等自动化操作。它的易用性、强…

(5)---STM32 的时钟系统

目录 1.时钟基本概念 时钟源常见振荡器 振荡电路 晶体振荡器 RC振荡器 2.G030时钟源 3.时钟树 4.STM32CubeMX时钟树配置 1.时钟基本概念 1) 时钟是嵌入式系统的脉搏,处理器内核在时钟驱动下完成指令执行,状态变换等动作, 外设部件…

基于redis客户端缓存机制实现本地缓存

文章目录 前言一、本地缓存和分布式缓存二、redis客户端缓存机制1.客户端缓存实现原理普通模式广播模式重定向模式redirect 2.优势和误区3.客户端缓存机制请求流程 三、项目实战1.引入依赖2.redis连接属性配置3.开启客户端缓存4.使用本地缓存5.测试 总结 前言 采用缓存一直是我…

VMware ESXi 6.0 U3 Final - ESXi 6 系列最终版下载

VMware ESXi 6.0 U3 Final - ESXi 6 系列最终版下载 VMware ESXi 6 Standard 请访问原文链接:https://sysin.org/blog/vmware-esxi-6/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org VersionRelease NameRelease …

RLHF中的PPO算法原理及其实现

RLHF中的PPO算法原理及其实现 ChatGPT是基于InstructGPT实现的多轮对话生成式大模型。ChatGPT主要涉及到的技术包括: 指令微调(Instruction-tuning);因果推断(Causal Language Modeling);人类…

从零开始Vue3+Element Plus后台管理系统(十五)——多语言国际化vue I18n

i18n国际化的内容比较多,写文章的时间也用得比较长,从上周五开始到本周一,断断续续完成了。 虽然实际工作中很多项目都不需要国际化,但是了解国际化的用法还是很有必要的。 i18n Vue I18n 是 Vue.js 的国际化插件。它可以轻松地…

PFC-FLAC3D Coupling Examples

目录 PFC-FLAC3D Coupling Examples Punch Indentation of a Bonded Material Sleeved Triaxial Test of a Bonded Material 命令流 结果 PFC-FLAC3D Coupling Examples Punch Indentation of a Bonded Material 这个例子展示了一个粘合颗粒模型(BPM&#xff0…

项目经历该如何写?

大家好,我是帅地。 这不春招来了吗,帮训练营的帅友们修改了很多简,其中问题最多的就是项目经历 专业技能这块了,特别是项目经历这块,很多人写了一大堆描述功能描述,但是自己具体干了什么却没怎么写&#…

研发工程师玩转Kubernetes——使用Deployment进行多副本维护

多副本维护是指,对一组在任何时候都处于运行状态的 Pod 副本的稳定集合进行维护。说的直白点,就是保证某种的Pod数量会被自动维持——增加了该类Pod会自动删除多余的,减少了该类Pod会自动新增以弥补,以保证Pod数量不变。 Kubernet…

day37_Tomcat_Maven

今日内容 一、Maven 二、Tomcat 一、Maven 1.1 引言 项目管理问题 项目中jar包资源越来越多,jar包的管理越来越沉重。 繁琐 要为每个项目手动导入所需的jar,需要搜集全部jar 复杂 项目中的jar如果需要版本升级,就需要再重新搜集jar 冗余 相…

基于Spring-动态调整线程池阻塞队列长度

最近在做一个动态线程池的组件,遇到了关于阻塞队列长度刷新的问题,所以记录下来,很有意思 我们都知道常用线程池分为二类,Spring-ThreadPoolTaskExecutor和JDK-ThreadPoolExecutor的,当然了Spring也是基于JDK做一步封装&#xff0…

​数据库原理及应用上机(实验四 SQL连接查询)

✨作者:命运之光 ✨专栏:数据库原理及应用上机实验 目录 ✨一、实验目的和要求 ✨二、实验内容及步骤 ✨三.实验结果 ✨四、实验总结 🍓🍓前言: 数据库原理及应用上机实验报告的一个简单整理后期还会不…

Zerto 10.0 发布 - 勒索软件防护、灾难恢复和多云移动性的统一解决方案

Zerto 10.0 发布 - 勒索软件防护、灾难恢复和多云移动性的统一解决方案 请访问原文链接:https://sysin.org/blog/zerto-10/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 携手 ZERTO 提升勒索软件保护与灾难恢复水…

Python异常处理

1. 异常概述 在程序运行过程中,经常会遇到各种错误,这些错误称为“异常”。这些异常有的是由于开发者一时疏忽将关键字敲错导致的,这类错误多数产生的是SyntaxError:invalid syntax(无效的语法),这将直接导…

JVM笔记

Java中对象一定分配在堆空间上吗?判断一个对象是否还活着GCgc频繁 Java中对象一定分配在堆空间上吗? 逃逸分析:分析对象动态作用域,当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传…

Redis6.2.5安装布隆过滤器BloomFilter

最近学习需要用到布隆过滤器,所以去RedisLabsModules下载RedisBloom插件,简单介绍一下安装的过程,首先需要先安装好Redis,建议使用Redis6以上版本,Redis安装教程查看https://smilenicky.blog.csdn.net/article/details…

什么是客户自助服务门户及其搭建方法

随着信息技术的快速发展,越来越多的企业开始转向以客户为中心的服务模式,而客户自助服务门户(Customer Self-Service Portal)则成为了重要的服务方式。它可以让客户在不需要人工干预的情况下,自行解决问题,…