【数据结构】--单链表力扣面试题⑥链表的回文结构

题述:对于一个链表,请设计一个时间复杂度为o(n),额外空间复杂度为o(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度<=900

测试样例:

输入:1->2->2->1

输出:true

题目分析:

回文就是对称结构。题目所让求解的肯定是在单链表的前提下,要是双链表就很好求了,但是单链表的缺陷就是不能倒着走,只能正着走

一种想法是,创建数组大小900的数组,如int a[900],然后遍历链表,把每个节点的值都放入此数组中,用数组来判断回文。这样做oj上是能跑过的,但是不可行,因为这种方法的空间复杂度是o(n),因为你链表开多长你数组就得开多大去存储,这是一个侥幸方法。

正确的思路:

①、找链表的中间节点,偶数个结点就找后一个。至于怎么找,我之前代码有写过

②、将指向链表中间节点的指针(包括本身)后面的所有节点逆置,如果和中间节点之前的节点内容相同,那就符合回文结构

③、找到中间节点后,即使逆置,还可以使中间节点的前一个节点指向中间节点,可以不用解开(改变指向),因为不解开(不改变指向)也可以判断是否为回文结构,相反如果解开链表,会更麻烦。

 

//判断链表的回文结构
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>struct ListNode
{int val;struct ListNode* next;
};
//1、找中间节点的函数
struct ListNode* middleNode(struct ListNode* head)
{struct ListNode* slow, * fast;fast = slow = head;while (fast && fast->next){slow = slow->next;fast = fast->next->next;}return slow;
}
//2、逆置链表的函数
struct ListNode* reverseList(struct ListNode* head)
{struct ListNode* n1, * n2, * n3;n1 = NULL;n2 = head;n3 = n2->next;while (n2){n2->next = n1;n1 = n2;n2 = n3;if (n3){n3 = n3->next;}}return n1;
}
bool chkPalindrome(struct ListNode* A)
{struct ListNode* mid = middleNode(A);//找到中间节点struct ListNode* rHead = reverseList(mid);//将中间节点(包括本身)后的节点翻转struct ListNode* curA = A;struct ListNode* curR = rHead;while (curA && curR)//因为对于有偶数个结点来说,curR会先碰到NULL,作为结束标志{//所以这里判断条件只写curR即可,在是回文的前提下。因为奇数节点时,curA和curR同时为空,//偶数是curR先为空if (curA->val != curR->val){return false;}else{curA = curA->next;curR = curR->next;}}return true;
}
int main()
{struct ListNode* n1 = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* n2 = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* n3 = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* n4 = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* n5 = (struct ListNode*)malloc(sizeof(struct ListNode));n1->val = 1;n2->val = 2;n3->val = 3;n4->val = 2;n5->val = 1;n1->next = n2;n2->next = n3;n3->next = n4;n4->next = n5;n5->next = NULL;int Istrue = chkPalindrome(n1);printf("该链表是否为回文结构:(1真/0假)%d", Istrue);return 0;
}

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

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

相关文章

中医养生APP小程序开发 了解传统文化传承医学经典

中国文化博大精深&#xff0c;中国传统文化更是历史久远&#xff0c;一直到几千年后的今天很多传统文化依然对我们现在的生活有着重大的影响&#xff0c;比如中医。随着人们对健康关注度的提高&#xff0c;很多人把目光投向了追本溯源的中医上&#xff0c;企图通过中医养生达到…

还原SQL Server 2008备份到另一台设备上

打开”SQL Server Management Studio“菜单&#xff0c;右击数据库&#xff0c;选择“还原数据库”&#xff1a; 设置目标目标数据库的名称和选择数据库备份文件的位置&#xff1a; 在"选项"页中&#xff0c;更改数据文件的还原路径为新的位置 &#xff0c;这里…

墨天轮专访TDengine陶建辉:坚持做难而正确的事,三次创业成就不悔人生

导读&#xff1a; 时序数据库&#xff08;Time Series Database&#xff09;在最近几年被越来越多的用户接受并使用&#xff0c;并有广泛的应用场景。云原生时序数据库 TDengine 一直稳居墨天轮时序数据库榜首&#xff0c;其近期的海外发展也初见成效。本期&#xff0c;墨天轮技…

清除 挖矿脚本 攻击

清除 挖矿脚本 攻击 1.查看系统进程,是否有异常: top 发现CPU占用率200%&#xff0c;判定服务器已经被植入木马 2.查看异常进程是哪一个程序造成的 ls -al /proc/14618 发现恶意程序&#xff08;绿色的是可执行文件&#xff09;/etc/lafy 3.删除恶意程序 cd /etc rm -rf …

记一次挖矿病毒应急处置全过程挖矿处置基本操作

记一次挖矿病毒应急处置全过程&挖矿处置基本操作 一、处置过程1.查看第一位的pid号&#xff1a;325352.进入/tmp/.X11-unix目录&#xff0c;其中11文件中写的是32535,01文件中写的是守护进程pid号10092&#xff08;目录里的文件不一定相同&#xff09;。将整个目录删除3.cr…

操作系统复习2.3.2-临界区的软件硬件实现方法

软件实现方法 思想 在进入区设置并检查一些标志来得知是否有进程已经在临界区&#xff0c;有则循环检查等待&#xff0c;无则直接进入&#xff0c;进程进入/离开临界区时修改标志 单标志法 通过标记进程号来实现控制只有一个进程能够进行临界区&#xff0c;但会出现P0进程进…

挖矿木马分析之肉鸡竟是我自己

之前服务器总是有一些异地登陆的告警信息&#xff0c;用代理就会这样&#xff0c;自己也没太在意。今天偶然间打开一看&#xff0c;发现如下提示&#xff01; 接下来处理一下&#xff01; 收集信息 finalshell登陆发现CPU占用率为100%ps auxw|head -1;ps auxw|sort -rn -k3|h…

电脑是否中挖矿病毒

『壹』 怎么检查自己电脑有没有被人用来挖矿&#xff0c;比特币 挖矿都是烧的显卡&#xff0c;以下方法可以鉴定自己显卡是不是矿卡 1&#xff1a;通过肉眼来识别这个硬件究竟是不是矿卡 &#xff0c;其实通过其他方式也可以测出&#xff0c;就比如说你到电脑里面去测矿卡的超…

诺顿360偷偷挖矿被怒喷 官方却说:都是为了用户好

杀毒软件诺顿360居然偷偷往电脑里装挖矿软件&#xff1f; 2022年刚开始&#xff0c;一位47万粉的“大V”在Twitter上就爆出了安全领域的猛料&#xff0c;还用f开头的单词亲切问候了软件厂商。 要知道&#xff0c;诺顿360可是在无数官推民选的排行榜中常年名列前茅&#xff0c;…

ETH挖矿显卡算力大全

大家买显卡挖ETH&#xff0c;肯定最关心算力了&#xff0c;这里我整理一版&#xff0c;供大家参考&#xff0c;目前只有主流的整理上了&#xff0c;后期会完善更多的供大家参考&#xff01; 欢迎大家加入大力矿工群&#xff1a;621159725 软件下载&#xff1a;百度云盘链接…

【网络安全】企业应急响应基础技能

windows 任务计划列表 1. 计算机管理窗口,选择 系统工具 中 任务计划程序 中的 任务计划程序库选项 可以查看任务计划的名称,状态,触发器等详细信息 2.powershell中输入get-scheduledtask 可以查看当前系统所有任务计划信息 任务路径,名称,状态等详细信息 3.命令行中输入s…

git commit之前,没有pull最新代码,导致无法push代码如何解决?——git三板斧

一、报错&#xff1a; 如果在 git commit 之前没有 pull 最新代码&#xff0c;再进行 push 操作可能会出现冲突&#xff0c;导致无法 push 代码。此时&#xff0c;git 会提示类似以下的错误信息&#xff1a; error: failed to push some refs to gitgithub.com:username/repo…

Github黑暗模式正式发布,Reddit直接飙至4k高赞

在 GitHub Universe 2020上,其中发布的新特性中最大的改变就是正式推出了黑暗模式,同时还宣布了针对公司的 GitHub 赞助功能,允许公司对关心的开源项目进行投资等。 你是否有过打开电脑被晃「瞎」的感觉? 最近,在GitHub Universe上,一款「暗黑」模式被推了出来。 官…

Win10系统开启黑暗主题

Win10系统开启黑暗主题教程 首先保证windows10系统版本号在2004-20H2及以上。小编此次更新的windows10版本号为20H2。 最新官方纯净版下载地址在msdn新官网中&#xff0c;官方地址&#xff1a;MSDN&#xff0c;我告诉你&#xff01; 登录后&#xff0c;选择windows10系统。 获…

Unity RPG 黑暗之光 问题记录 上 (1-63 地形场景 角色选择 行走 相机跟随、旋转、缩放 任务系统 面板栏 背包系统 状态系统)

001 游戏预览和介绍 职业选择 鼠标点击移动 旋转 缩放 药品 装备 任务NPC 状态 装备 技能 存档 代码跟原视频的有所改动&#xff0c;主要是主角行为逻辑 002 导入场景资源&#xff0c;搭建场景 3方资源&#xff1a;RPG NGUI StandarAssets 进去关闭自动生成 &#xff08;…

黑暗之魂3正在从服务器获取信息,黑暗之魂3如何解决入侵服务器问题 | 手游网游页游攻略大全...

发布时间&#xff1a;2016-01-04 今天为大家带来的是黑暗之魂3法兰守卫入侵方法,一起来看看吧! 黑暗之魂3 法兰守卫入侵方法 法兰守卫怎么入侵 今天为大家带来的是黑暗之魂3法兰守卫入侵方法,一起来看看吧! 你的游戏可能被防火墙禁止了——解决方法:找到你的 ... 标签&#xff…

quartz配置动态任务,从数据库读取相应的类及方法,执行任务(任务添加、修改、暂停、恢复)

界面 步骤&#xff1a;首先创建一个javabean---》创建Quartz工厂---》xmlSchedulerFactoryBean---》配置通过反射机制---》执行相应的service 1、bean package com.oppo.common.quartz;/*** quartz任务类* author xuchangcheng* 2018年8月24日**/ public class ScheduleJob {…

【Linux】-自动化构建工具(make/makefile)

作者&#xff1a;小树苗渴望变成参天大树 作者宣言&#xff1a;认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; 文章目录 前言 前言 今天我们来讲讲再Linux中开发必备的一项技能&#xff0c;没有这个…

BERT中的黑暗秘密

点击上方“AI公园”&#xff0c;关注公众号&#xff0c;选择加“星标“或“置顶” 作者&#xff1a;Anna Rogers 编译&#xff1a;ronghuaiyang 导读 在finetune BERT的时候发生了什么&#xff1f; 这篇博客文章总结了我们EMNLP 2019年的论文“Revealing the Dark Secrets of B…

计算机竞赛游戏探险岛,冒险岛2主线任务攻略_第三章主线任务图文攻略

冒险岛2现已开启终极内测&#xff0c;很多玩家可能不知道主线任务怎么做&#xff0c;下面为大家带来冒险岛2第三章主线任务攻略(第三章&#xff1a;特别的任务)&#xff0c;一起来看看吧&#xff01; *冒险岛2第三章主线任务攻略 接下来要继续更新的&#xff0c;是冒险岛2主线任…