探索回文链表:识别中轴,判断对称性

news2025/1/21 10:21:44

在这里插入图片描述

如何识别回文链表呢?大家可以先思考一下,看看能不能做出力扣234. 回文链表这道题目。

在这里插入图片描述
识别以head为头结点的链表是否为回文链表分为三个步骤,分别是:

  1. 找出链表的中间结点mid。如果链表有偶数个结点,则找出偏右边的结点。如:1->2->3->2->1,中间结点是3;1->2->2->1,中间结点是右边的2。
  2. 逆置以mid为头结点的链表,假设逆置后的头结点为rmid。
  3. 遍历以head为头结点的链表和以mid为头结点的链表,判断是否为回文联表。

下面以链表1->2->2->1为例演示

初始状态:
在这里插入图片描述
找出中间结点mid。

在这里插入图片描述
逆置以mid为头结点的链表,新的头结点为rmid。

在这里插入图片描述
此时head视角:1->2->2->NULL;rmid视角:1->2->NULL。rmid视角和head视角的前半部分相同,则回文。

注:实际实现代码时,我直接用mid存储逆置后的链表,可以少定义一个变量。

下面来讨论如何实现这3个步骤。

step 1: 找出中间结点

我们可以定义2个指针,fast和slow。一开始两个指针都存储链表的头结点,接下来遍历链表,fast一次走2步,slow一次走1步,当fast走到链表尾部时,slow的位置就是中间结点。

struct ListNode* MiddleNode(struct ListNode* head)
{
	struct ListNode* fast, * slow;
	fast = slow = head;
	// 快指针一次走两步,慢指针一次走一步
	while (fast && fast->next)
	{
		fast = fast->next->next;
		slow = slow->next;
	}

	return slow;
}

step 2: 逆置链表

定义2个指针变量,n1和n2。一开始n1为NULL,n2存储链表的头结点。每次让n2结点指向n1结点,这样链表的方向就反过来了。注意:当n2结点的后继指针指向n1时,就找不到原链表的下一个结点了,所以要提前定义一个n3指针,记录原链表n2的后继指针。

struct ListNode* ReverseList(struct ListNode* head)
{
	struct ListNode* n1 = NULL, * n2 = head;
	while (n2)
	{
		struct ListNode* n3 = n2->next;

		// 逆置结点关系
		n2->next = n1;

		// 迭代
		n1 = n2;
		n2 = n3;
	}

	return n1;
}

step 3: 结合前2个步骤,判断回文链表

判断原链表的前半部分和原链表后半部分逆置后的链表是否相同。

bool isPalindrome(struct ListNode* head) {
	// 找出链表中间结点,如果是偶数个结点则找到中间偏右的结点
	struct ListNode* mid = MiddleNode(head);

	// 从中间结点开始,逆置后半段链表
	mid = ReverseList(mid);

	// 若逆置后的链表和前半部分相同,则回文
	while (mid)
	{
		if (head->val != mid->val)
		{
			return false;
		}

		head = head->next;
		mid = mid->next;
	}

	return true;
}

在这里插入图片描述

总结

  1. 链表中间结点思路:快慢指针法。
  2. 逆置链表思路:遍历链表,让每个结点指向前一个结点。
  3. 逆置链表的后半部分,若和前半部分相同,则为回文链表。

感谢大家的阅读!

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

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

相关文章

怎么把pdf图片转换成jpg?pdf转jpg的方法分享

pdf文件在我们的日常工作中非常的常见,因为这种文件安全性高,不会轻易的乱码,所以受到了我们的欢迎,但是它不容易被编辑,而且占用内存会比较大,所以我们需要将pdf文件进行转换,接下来小编会为大…

什么是synchronized的重量级锁

今天我们继续学习synchronized的升级过程,目前只剩下最后一步了:轻量级锁->重量级锁。 通过今天的内容,希望能帮助大家解答synchronized都问啥?中除锁粗化,锁消除以及Java 8对synchronized的优化外全部的问题。 获…

(笔记五)利用opencv进行图像几何转换

参考网站:https://docs.opencv.org/4.1.1/da/d6e/tutorial_py_geometric_transformations.html (1)读取原始图像和标记图像 import cv2 as cv import numpy as np from matplotlib import pyplot as pltpath r"D:\data\flower.jpg&qu…

电工-照明电路施工图

照明电路施工图 上面介绍的电气照明基本电路用作施工的依据是不够的,这是因为图上并没有注明电气元件的规格、型号、安装要求、线路敷设方式以及其他一些特征。作为实际电路安装的依据,必须是根据国家颁布的有关电器技术标准和统一符号绘制的施工图。照…

2022年下半年系统架构设计师真题(下午带答案)

试题一 (25分) 某电子商务公司拟升级其会员与促销管理系统,向用户提供个性化服务,提高用户的粘性。在项目立项之初,公司领导层一致认为本次升级的主要目标是提升会员管理方式的灵活性,由于当前用户规模不大,业务也相对…

QT的介绍和优点,以及使用QT初步完成一个登录界面

QT介绍 QT主要用于图形化界面的开发,QT是基于C编写的一套界面相关的类库,进程线程库,网络编程的库,数据库操作的库,文件操作的库…QT是一个跨平台的GUI图形化界面开发工具 QT的优点 跨平台,具有较为完备…

MySQL存储引擎MyISAM和InnoDB特点全解

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师…

Flutter开发- iOS 问题CocoaPods not installed or not in valid state

解决问题方案: 1、先检查本机CocoaPods是否安装,通过gem list 查看是否安装 打开终端,执行gem list,出现图中的数据即为已安装。未安装看第4 步 2、已经安装了CocoaPods,还出现了图中的提示,你可能已经猜…

快速制作餐厅签到抽奖营销活动,吸引更多顾客

在如今竞争激烈的市场中,吸引用户参与活动是企业获取关注和提升转化率的重要手段。而签到抽奖活动无疑是一种简单而又有效的方式。本文将教你如何利用乔拓云平台后台制作一个快速而有效的签到抽奖活动。 首先,登录乔拓云平台后台,进入【营销活…

【自学开发之旅】基于Flask的web开发(一)

web开发项目设计: 立项-需求分析-设计(原型图、数据库、api设计)-技术选型-写代码-测试-上线 web开发的本质上就是生成超文本。 前端负责展示,后端负责逻辑处理:后逻辑请求(接收请求、响应请求&#xff0…

CSA研讨会|聚焦云原生安全,探讨技术与应用策略

为产业数字化保驾护航, 云原生安全体系如何有效抵御网络威胁? 网络安全的下一个十年, 云原生安全是网络安全创新之路吗? CNAPP部署现状,你了解多少? 9月6日(周三)下午14&#xff1a…

教你实现一个深浅拷贝!

浅拷贝的原理与实现 对于浅拷贝的定义我们可以初步理解为: 自己创建一个新的对象,来接受你要重新复制或引用的对象值。如果对象属性是基本的数据类型,复制的就是基本类型的值给新对象;但如果属性是引用数据类型,复制的…

每日一题(移除链表元素)

每日一题(移除链表元素) 203. 移除链表元素 - 力扣(LeetCode) 思路一: 可以创建一个新的链表头节点newhead,只要是原链表中值不为val的节点、都通过尾插操作插到newhead所指向的链表中,原链表中…

swiper插件使用

swiper插件使用 1.进入官网 官网地址 2.下载文件保存到自己电脑上 3.解压文件夹,找到如图所示的两个文件夹,复制并引入到自己的项目中 4.使用 1.继续打开官网地址,寻找在线演示里面的轮播图案例,挑一个自己需要的,到新窗口打开 2.打开之后,右键,检查网页源代码 3.复制里面…

优秀案例 | 数字人+文化浪漫,开启城市数字文化沉浸式体验

数字人作为城市宣传的新载体、新介质, 可带来多元化、数字化的城市文旅发展模式, 通过打破虚实次元空间, 展现出传统文化与现代生活的相碰撞的魅力。 数字人文化浪漫 赋能城市文化新体验 南京首个以文化元宇宙主题体验中心及高校、文博…

基于JavaWeb和mysql实现网上书城前后端管理系统(源码+数据库+开题报告+论文+答辩技巧+项目功能文档说明+项目运行指导)

一、项目简介 本项目是一套基于JavaWeb和mysql实现网上书城前后端管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含:项目源码、项目文档、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都…

【计算机网络】带你一文搞懂Http和Https的关系和区别!(最强详解!!)

目录 首先来讨论一下Http和Https的背景 基本概念 一、HTTP协议: 二、HTTPS协议: 区别 工作原理 HTTP工作原理 Https工作原理 HTTPS优缺点 优点: 缺点: HTTP请求消息和响应消息 响应消息 进行TLS握手时的通俗的解释&a…

智能安全帽~生命体征检测与危险气体检测一体化集成设计还是蓝牙无线外挂式方式好?

生命体征(心率、血氧等)检测&上报平台,危险气体采集&上报平台,是智能安全帽产品中常见的两种选配件,它们的实现有两种典型的模式: 1)将传感器集成到主板上,做成一体化的智能…

RabbitMQ工作模式-工作队列

官网关于工作模式的解释地址:https://www.rabbitmq.com/getstarted.html Work Queue(工作队列) 生产者发消息,启动多个消费者来消费消息,每个消费者仅消费部分消息,可达到负载均衡的效果。 创建生产者 i…

java错误解决方案百科

一、业务开发缺陷 ① 工期紧、逻辑复杂,开发人员会更多地考虑主流程逻辑的正确实现,忽略非主流程逻辑,或保障、补偿、一致性逻辑的实现; ② 往往缺乏详细的设计、监控和容量规划的闭环,结果就是随着业务发展出现各种各…