leetcode:234.回文链表(详解)

news2024/11/26 2:53:51

前言:内容包括-题目,代码实现,大致思路,代码解读

题目:

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

示例 1:


输入:head = [1,2,2,1]
输出:true
示例 2:


输入:head = [1,2]
输出:false

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/palindrome-linked-list
 

代码实现:

//找中间结点
 struct ListNode*FindMid(struct ListNode*head)
 {
    struct ListNode* slow = head;
	struct ListNode* fast = head;
	while (fast && fast->next)
	{
		slow = slow->next;
		fast = fast->next->next;
	}
	return slow;

 }

//翻转后半段链表
 struct ListNode* reverse(struct ListNode*head)
 {
    struct ListNode* prev = NULL;
	struct ListNode* cur = head;
	while (cur)
	{
		struct ListNode* next = cur->next;
		cur->next = prev;
		prev = cur;
		cur = next;
		if (next)
		{
			next = next->next;
		}
	}
	return prev;
 }

bool isPalindrome(struct ListNode* head)
{

  struct ListNode* mid = FindMid(head);
	struct ListNode* rmid = reverse(mid);
	while (rmid)
	{
		if (head->val == rmid->val)
		{
			head = head->next;
			rmid = rmid->next;
		}
		else
		{
			return false;
		}
	}
	return true;
}

大致思路:

1 翻转后半段链表:

   a 找到中间结点

   b 翻转中间结点(包括中间结点在内)后面的所有结点

2 比较前半段链表和翻转后的后半段链表:

   a 若是前半段中的结点值==后半段中的结点值  继续走向下一对要比较的结点

   b 若是前半段中的结点值!=后半段中的结点值,表示该链表非回文链表

比如:原链表 1 2 2 1

          翻转后半段: 1 2 1 2

          前半段 1 2和后半段 1 2 完全相同,表示该链表是回文链表

代码解读:

part 1 找寻中间结点的函数 FindMid

 struct ListNode*FindMid(struct ListNode*head)
 {
    struct ListNode* slow = head;
	struct ListNode* fast = head;
	while (fast && fast->next)
	{
		slow = slow->next;
		fast = fast->next->next;
	}
	return slow;

 }

快慢指针法:slow一次走一步,fast一次走两步

当fast为NULL(结点个数为偶数个)或者fast->next为NULL(结点个数为奇数个)时循环结束,slow就是中间结点。

偶数个结点的链表它的中间结点有两个,我们取较后的一个为最终正确的中间结点

part 2 翻转后半段链表

 struct ListNode* reverse(struct ListNode*head)
 {
    struct ListNode* prev = NULL;
	struct ListNode* cur = head;
	while (cur)
	{
		struct ListNode* next = cur->next;
		cur->next = prev;//改变结点next的指向
        //下面是迭代
		prev = cur;
		cur = next;
		if (next)//next若已经是NULL,则不执行下面这行代码,否则就是对NULL指针解引用
		{
			next = next->next;
		}
	}
	return prev;//prev就是翻转后的链表的头结点
 }

 part 3

bool isPalindrome(struct ListNode* head)
{

  struct ListNode* mid = FindMid(head);
	struct ListNode* rmid = reverse(mid);
	while (rmid)
	{
		if (head->val == rmid->val)
		{
			head = head->next;
			rmid = rmid->next;
		}
		else
		{
			return false;
		}
	}
	return true;
}

遍历比较前半段链表和翻转后的后半段链表

结点的值相同则继续比较下一对

结点的值不同则返回false

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

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

相关文章

ZZS-7系列分闸、合闸、电源监视综合控制装置ZZS-7/1 ac220v

ZZS-7系列分闸、合闸、电源监视综合控制装置 系列型号: ZZS-7/1分闸、合闸、电源监视综合控制装置 ZZS-7/11分闸、合闸、电源监视综合控制装置 ZZS-7/12分闸、合闸、电源监视综合控制装置 ZZS-7/13分闸、合闸、电源监视综合控制装置 ZZS-7/14分闸、合闸、电源…

<Linux开发>系统移植 -之-使用buildroot构建BusyBox根文件系统

<Linux开发>系统移植 -之-使用buildroot构建BusyBox根文件系统 一、前言二、 buildroot 下载三、配置buildroot基础参数3.1 配置Target options3.2 配置Toolchain3.3 配置System configuration3.4 配置Filesystem images3.5 禁止编译 Linux 内核和 uboot…

音频大模型导读

1 介绍 本次分享包含音频压缩,语音识别,语音合成,以及近两年来大模型在音频领域的应用,涉及八篇论文和一个近期github霸榜的语音合成工具。 结果如下图所示:(图链接:audio_llm) 共…

Grafana 系列-统一展示-2-Prometheus 数据源

系列文章 Grafana 系列文章 Grafana Prometheus 数据源 Grafana 提供了对 Prometheus 的内置支持。本文会介绍 Grafana Prometheus(也包括 Prometheus 的兼容实现,如 Thanos, Mimir 等) 数据源的部分选项、变量 (Variable)、查询 (Query) …

API接口获取商品数据

作为一名技术爱好者,我们总会遇到各种各样的技术问题,需要寻找合适的技术解决方案。而在互联网时代,我们可以快速通过搜索引擎获取丰富的技术资源和解决方案。然而,在不同的技术分享中,我们常常会遇到质量参差不齐的文…

文献阅读:LaMDA: Language Models for Dialog Applications

文献阅读:LaMDA: Language Models for Dialog Applications 1. 工作简介2. 具体工作 1. 模型训练 1. 模型预训练2. finetune 2. 模型评估 1. SSI2. Safety3. Groundness4. Helpfulness5. Role Consistency 3. 实验结果整理4. 结论 & 思考 https://arxiv.org/a…

软件架构与设计模式复习笔记

考纲(张友生版本软件架构 考试题型: 10*3单选 5*3简答题 5*3设计图(含画图) 10*2 论述题 10*2综合题 复习以课件为主,书为辅 第一章 (软件危机) ? ? 构造模型与实现 掌握软件结构体系核心模型 第二章 软件体…

PBDB Data Service:Icon images of lifeforms(生命形式的图标图像)

Thumbnail images of lifeforms(生命形式的图标图像) 描述用法参数方法响应值格式术语表 描述 此操作返回表示指定分类的图像,或关于图像的信息。如果后缀是 .png,则返回图像内容数据。否则,将以指定的格式返回一个描…

【力扣-232.】用栈实现队列

🖊作者 : D. Star. 📘专栏 : 数据结构 😆今日分享 :“多看效应”-----对越熟悉的东西越喜欢的现象,心理学上称为“多看效应”。多看效应不仅仅是在心理学实验中才出现,在生活中,人们也常常能发现这种现象。…

HashMap 底层原理///HashMap详解

HashMap超详细探讨 总述从集合出发探讨HashMapCollection接口继承树Map接口继承树 从Map接口来,一步一步深入其中Map接口概述Map接口:常用方法Map接口 Map实现类之一:HashMapHashMap的存储结构HashMap源码中的重要常量JDK 1.8之前JDK 1.8总结…

阿里云CPU性能AMD EPYC Genoa 9T34处理器主频3.4 GHz

阿里云AMD服务器CPUAMD EPYC Genoa 9T34处理器,主频3.4 GHz,单核睿频最高3.75 GHz,计算性能稳定,阿里云服务器网分享AMD EPYC Genoa 9T34性能测评: AMD EPYC Genoa 9T34 阿里云AMD服务器性能增强通用型g8ae、计算平衡…

【容器化】Docker 简介和安装

【容器化】Docker 简介和安装 DockerDocker的应用场景Docker 的优点1、快速,一致地交付您的应用程序2、响应式部署和扩展3、在同一硬件上运行更多工作负载 Docker 架构Docker 安装Ubuntu Docker 、Debian Docker 安装使用官方安装脚本自动安装手动安装使用 Shell 脚…

渲染流水线 相关知识总结

目录 抽象理解渲染过程详细介绍各个渲染步骤1. 应用阶段1.1设置场景数据1.2 Culling 粗粒度剔除1.3 渲染设置1.4 传递几何信息1.5 调用DrawCall 2. 几何阶段2.1 几何着色器2.2 可选着色器2.3 投影变换 projection2.4 裁切 Clipping2.5 屏幕映射 ScreenMapping 3. 光栅化阶段3.1…

C++ Primer阅读笔记--返回类型和return语句

1--返回引用 同其他引用类型一样,如果函数返回引用,则该引用仅是所引对象的一个别名;则返回结果时不会发生拷贝操作; 不能返回局部对象的引用或指针;因为局部对象在函数结束后会被释放,从而其引用或指针将指…

【第六篇:测试左移-研发流程优化】

(1)规范了技术需求的研发流程(和产品需求一样走相同的流程,只不过需求的主R变为了RD) (2)规范了需求变更流程:需求变更要合理并做到全员周知; (3)强调冒烟不过,提测打回流程; (4)增加交互视觉评审环节,方便RD更合理估时; (5)规范回归测试流程,回归测试时需…

PbootCMS Sqlite数据库转Mysql数据库教程 sqlite转mysql

PbootCMS默认采用的是Sqlite数据库,系统自带完整后台以及一套响应式模板,放入PHP(5.3+)环境即可直接使用 线上搭建简易环境为:Apache 、 PHP5.6-PHP7.3 、 Mysql5.5+ 所以如果已经上线一段时间了,网站已经有较多内容后要想换成Mysql版本是很不方便的,以下就是快速将Mys…

WebSocket的那些事(2-实操篇)

目录 一、概述二、Websocket API1、引入相关依赖2、配置WebSocket处理器3、WebSocket配置4、测试 三、总结 一、概述 在上一节 WebSocket的那些事(1-概念篇)中我们简单的介绍了关于WebSocket协议的相关概念、与HTTP的联系区别等等。 这一节将会带来Web…

BM59-N皇后问题

题目 N 皇后问题是指在 n * n 的棋盘上要摆 n 个皇后。 要求:任何两个皇后不同行,不同列也不在同一条斜线上。 求给一个整数 n ,返回 n 皇后的摆法数。 数据范围: 1≤n≤9。 要求:空间复杂度 O(1) ,时间复杂度 O(…

牛客 NC24724 Feb S]Chocolate Eating 解题报告

原题链接&#xff1a; 登录—专业IT笔试面试备考平台_牛客网 题目描述&#xff1a; 链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 Bessie has received N (1 < N < 50,000) chocolates from the bulls, but doesnt want to …

Notepad++ 配置python环境及虚拟环境

背景&#xff1a; 在执行某些项目的时候&#xff0c;经常会否遇到这样一种情况(以python语言为例)&#xff1a;不想在python的基础环境下运行&#xff0c;创建了虚拟环境来装相关项目的包&#xff0c;但是每次使用都要切换到虚拟环境下面使用"activate "命令激活环境…