[链表]求中间节点、反转链表、回文链表

news2024/9/26 3:30:36

一、求链表的中间节点

876. 链表的中间结点 - 力扣(LeetCode)

快慢指针法:

        分别定义两个节点的指针(pSlow和pFast)指向链表的第一个节点,然后两个指针一起往后遍历链表,pFast一次移动两个节点,pSlow一次移动一个节点,通过路程差可知,当pFast遍历完链表时,pSlow只遍历了一半的节点数,此时pSlow指向的节点就是我们要找的中间节点。

链表节点数为奇数和偶数时的情况:

        

 具体代码:

class Solution {
public:
    ListNode* middleNode(ListNode* head) {
        //快慢指针法
        ListNode* pFast = head;
        ListNode* pSlow = head;

        //注意先判断pFast所指的节点是否为空再判断其next指针是否为空,否则会出现解引用空指针的情况
        while(pFast != nullptr && pFast->next != nullptr)
        {
            pFast = pFast->next->next;//移动两步
            pSlow = pSlow->next;//移动一步
        }
        
        return pSlow;
    }
};

 二、反转链表

206. 反转链表 - 力扣(LeetCode)

        定义三个指针(pPrev,pCur,pNext),分别指向前一个节点,当前节点,和后一个节点,我们的pPrev和pNext一开始指向空,因为一开始pCur是反转后的尾结点,而头结点有可能为空指针,一开始令pNext = pCur->next会有解引用空指针的风险。每次遍历将当前节点的下一个节点指针改为指向前一个节点指针pPrev,然后更新三个指针的指向,往后移动一步。在更新指针时,因为pCur->next的指向已经改变,要往后遍历就需要保存之前pCur->next所指向的节点,所以我们需要在每次修改pCur->next的指向时先用pNext保存pCur->next的节点地址,当修改好指向后,就可以找到原来pCur的下一个节点了。重复操作直到pCur遍历完整个链表就完成了链表的反转。

下面是示例图:

具体代码: 

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* pPrev = nullptr;
        ListNode* pCur = head;
        ListNode* pNext = nullptr;

        while(pCur != nullptr)
        {
            //保存pCur后面的节点
            pNext = pCur->next;
            //将pCur连接上一个节点
            pCur->next = pPrev;
            //更新指针指向
            pPrev = pCur;
            pCur = pNext; 
        }

        //此时pPrev就是头结点,pCur指向空
        return pPrev;
    }
};

三、判断回文链表

        LCR 027. 回文链表 - 力扣(LeetCode)

        由于单链表不能逆向遍历,判断回文结构时有点麻烦,可以使用暴力算法来解决这个题目,但是,面试题对这道题有严格要求,需要设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。

        这个时候需要使用我们之前写的求链表的中间节点和反转链表的算法来完成时间复杂度为O(n),额外空间复杂度为O(1)的要求了。具体思路就是先找到这个链表的中间节点,将中间节点后面的子链表视为一个新的链表,将其反转,然后将反转后的结果和前一半的子链表进行对比,看每一个节点是否都相同,否则就不是回文链表。在我们依次比较完后,我们还需要将反转的子链再反转回去,恢复链表原来的结构,防止内存泄漏,因为在函数外头只有第一个子链的头结点,而第二个子链的头结点是找不到的,就会导致第二个子链的节点内存泄漏,并且破坏了链表的原有结构

将链表拆分成两个子链表:

奇数个:

偶数个:

        然后就比较两个链表是否相同就可以了。

具体代码:

class Solution {
public:
    //快慢指针求中间节点
    ListNode* middleNode(ListNode* head) 
    {
        //快慢指针法
        ListNode* pFast = head;
        ListNode* pSlow = head;

        //注意先判断pFast所指的节点是否为空再判断其next指针是否为空,否则会出现解引用空指针的情况
        while(pFast != nullptr && pFast->next != nullptr)
        {
        pFast = pFast->next->next;//移动两步
        pSlow = pSlow->next;//移动一步
        }

        return pSlow;
    }

    ListNode* reverseList(ListNode* head)
    {
        ListNode* pPrev = nullptr;
        ListNode* pCur = head;
        ListNode* pNext = nullptr;

        while(pCur != nullptr)
        {
            //保存pCur后面的节点
            pNext = pCur->next;
            //将pCur连接上一个节点
            pCur->next = pPrev;
            //更新指针指向
            pPrev = pCur;
            pCur = pNext; 
        }

        //此时pPrev就是头结点,pCur指向空
        return pPrev;
    }
    bool isPalindrome(ListNode* head) 
    {
        //找到中间节点
        ListNode* pMid = middleNode(head);
        
        
        //逆转中间节点后的链表
        ListNode* reHead = reverseList(pMid);

        //遍历判断两个链表是否相等
        ListNode* pList1 = head;
        ListNode* pList2 = reHead;

        while(pList1 != nullptr && pList2 != nullptr)
        {
            if(pList1->val != pList2 ->val)
                return false;
            
            pList1 = pList1->next;
            pList2 = pList2->next;
        }

        //将两个链表恢复原状,防止内存泄露
        reverseList(reHead);
        return true;
    }
};

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

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

相关文章

打工人好用的大模型问答,还需要一款可靠的文档解析工具

如果说三四年前,我们对AI的展望还停留在科幻片的话,现在,通向AI智能的路径已经初现端倪。各行各业的朋友们不约而同地嗅到了大模型带来的生产方式变革气息。 LLM宣布了AI时代的正式到来。 2022年11月30日,ChatGPT发布&#xff0…

牛客NC362 字典序排列【中等 DFS Java/Go/PHP】

题目 题目链接: https://www.nowcoder.com/practice/de49cf70277048518314fbdcaba9b42c 解题方法 DFS,剪枝Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回…

SaltStack

SaltStack 官方文档 1.简介 作用:批量处理状态管理(配置管理)事件驱动(通过事件触发操作)管理私有云/公有云 yum仓库:http://repo.saltstack.com 安装1.master和minionrpm --import https://repo.saltproj…

政府鼓励社会力量建设气膜体育场馆—轻空间

2023年12月1日,国家体育安全总局发布的《关于政协第十四届全国委员会第一次会议第00374号(文体宣传类020号)提案答复的函》中指出,2016年和2020年国务院发布的文件中均涉及推动气膜场馆建设及完善装配式建筑相关政策。下一步&…

Git学习篇

目录 使用命令导入项目 使用命令导入项目 1. 使用git init 命令初始化一个新的Git仓库。 git init 是 Git 命令,用于初始化一个新的 Git 仓库。当您想要开始跟踪一个新项目的版本控制时,可以运行 git init 命令来初始化一个空的 Git 仓库。 如果出现以下…

项目文件上传宝塔后只有一个文件内容不同且没有报错该如解决?

一、遇到此类问题不要慌先检查文件是否上传正确; 二、检查文件是否可以在浏览器中正常运行; 三、检查文件是否存在某些不明显的报错; 四、检查此页面的是否存在代码错误; 五、标签链接是否错误; 我所遇到的错误是…

白酒:不同产地白酒的风格特点与比较

云仓酒庄豪迈白酒,作为中国白酒的一部分,其风格特点深受产区的影响。不同产地的白酒,由于自然环境、酿造工艺等因素的差异,形成了各自与众不同的风味和特点。下面让云仓酒庄豪迈白酒来比较一下不同产地白酒的风格特点。 首先&…

使用Python操作Jenkins

大家好,Python作为一种简洁、灵活且功能丰富的编程语言,可以与各种API轻松集成,Jenkins的API也不例外。借助于Python中的python-jenkins模块,我们可以轻松地编写脚本来连接到Jenkins服务器,并执行各种操作,…

香橙派 AIpro开发板开箱测评(代码开源)

前言:有幸能够收到一块梦寐以求的 AI 边缘计算开发板 OrangePi AIpro,非常感谢官方大大给予的宝贵机会。OrangePi AIpro是香橙派官方跟华为昇腾合作的新一代边缘计算产品,其使用华为昇腾 AI 技术路线,搭配集成图像处理器&#xff…

odoo17 hooks使用

odoo17 hooks函数: 1、pre_init_hook 安装引擎开始前执行的函数 2、post_init_hook 安装引擎开始后执行的函数 3、uninstall_hook 卸载执行的函数 以pre_init_hook为例: 1)hooks.py 定义函数: 2)init.py引用定义的函数 3)manifest…

RabbitMQ不完整的笔记

同步的不足 1、拓展性差,当要添加功能时,需要在原来的功能代码上做修改,高耦合。 2、性能下降,调用者需要等待服务提供者执行完返回结果后,才能继续向下执行 3、级联失败,由于我们是基于OpenFeign调用交易…

江协科技STM32学习-0 购买套件

前言: 本文是根据哔哩哔哩网站上“江协科技STM32”视频的学习笔记,在这里会记录下江协科技STM32开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技STM32教学视频和链接中的内容。 引用: STM32入门教程-2023版 细致讲…

芋道源码 / yudao-cloud:前端技术架构探索与实践

摘要: 随着企业信息化建设的深入,后台管理系统在企业运营中扮演着至关重要的角色。本文将以芋道源码的yudao-cloud项目为例,深入探讨其前端技术架构的设计思路、关键技术与实现细节,并分享在开发过程中遇到的挑战与解决方案。 一、…

《Python编程从入门到实践》day34

# 昨日知识点回顾 json文件提取数据、绘制图表渐变色显示 # 今日知识点学习 第17章 17.1 使用Web API Web API作为网站的一部分,用于与使用具体URL请求特定信息的程序交互,这种请求称为API调用。 17.1.1 Git 和 GitHub Git:分布式版本控制系…

Java语言ADR药物不良反应系统源码Java+IntelliJ+IDEA+MySQL一款先进的药物警戒系统

Java语言ADR药物不良反应系统源码JavaIntelliJIDEAMySQL一款先进的药物警戒系统源码 ADR药物不良反应监测系统是一个综合性的监测平台,旨在收集、报告、分析和评价药品在使用过程中可能出现的不良反应,以确保药品的安全性和有效性。 以下是对该系统的详细…

【职业教育培训机构小程序】教培机构“招生+教学”有效解决方案

教培机构“招生教学”有效解决方案在数字化转型的浪潮中,职业教育培训机构面临着提升教学效率、拓宽招生渠道、增强学员互动等多重挑战。小程序作为一种新兴的移动应用平台,为解决这些痛点提供了有效途径。 一、职业教育培训机构小程序的核心功能 &…

当传统文化遇上数字化,等级保护测评的必要性

第二十届中国(深圳)国际文化产业博览交易会5月23日在深圳开幕。本届文博会以创办20年为契机,加大创新力度,加快转型升级,着力提升国际化、市场化、专业化和数字化水平,不断强化交易功能,打造富有…

[数据集][目标检测]RSNA肺炎检测数据集VOC+YOLO格式6012张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):6012 标注数量(xml文件个数):6012 标注数量(txt文件个数):6012 标注…

[集群聊天服务器]----(十一) 使用Redis实现发布订阅功能

接着上文,[集群聊天服务器]----(十)Nginx的tcp负载均衡配置–附带截图,我们配置nginx,使用了多台服务端来提高单机的并发量,接下来我们回到项目中,思考一下,各个服务端之间怎么进行通信呢? 配置…

专业145+总410+成电电子科技大学858信号与系统考研经验电子信息与通信工程,抗干扰,空天,资环,真题,大纲,参考书。

今年考研总分410,专业课858信号与系统145,顺利上岸成电,毕设已经搞得七七八八,就等毕业了,抽空整理回顾一下去年的复习,给群里的同学提供一些参加,少走弯路,对于整体复习的把握有个大概得规划。…