中心对称链表

文章目录

  • 1 题目
  • 2 思路
    • 2.1 思路一
    • 2.2 思路二
    • 2.3 考点
    • 2.4 扩展
  • 3 实现
    • 3.1 思路1
    • 3.2 思路2
    • 3.3 完整例子

1 题目

已知长度为n(n>1)的单链表,表头指针为L,结点结构由data和next两个域构成,其中data域为字符型,设计一个在时间和空间两方面都尽可能高效的算法,判断该单链表是否中心对称(例如xyx,xxyyxx都是中心对称)。

2 思路

2.1 思路一

把单链表的后半段依此存入栈中,然后遍历单链表的前半段,每遍历一个元素,就从栈中弹出一个元素,进行比较,如果值不相等,则该链表为非对称链表,否则,当栈为空时,则该链表为对称链表。

例1: 对于单链表”xyzzyx”,把后半段yxx依次存入栈中,栈中为xyz,依次遍历单链表的前半段xyz,遍历x时,比较栈顶元素x;遍历y时,比较栈顶元素y;遍历z时,比较栈顶元素z,直到栈空,然后该链表为对称链表。

例1: 对于单链表”xyzwqyx”,把后半段yxx依次存入栈中,栈中为xyz,依次遍历单链表的前半段xyz,遍历x时,比较栈顶元素z;遍历y时,比较栈顶元素y;遍历z时,比较栈顶元素q,值不相等,然后该链表为非对称链表。

2.2 思路二

把单链表的后半段原地逆置,然后使用双指针p、q依次遍历单链表的前半段和后半段,若相等,则将p、q指向下一个元素,当q指向空指针时,该链表为对称链表;否则该链表为非对称链表。

2.3 考点

栈、头插法

2.4 扩展

思考:当链表长度未知时,该怎么求?

  • 1,思路一:遍历单链表得到长度,按照原方法。
  • 2,思路二:把单链表依次存入栈和入队列,然后依次出栈和出队列,比较元素。

3 实现

3.1 思路1

int judge1(LinkList L, int n){LNode* stack = new LNode[n/2];int index = -1;LNode *q = L->next, *p = L->next;for(int i = 1;i < (n+1)/2 + 1;i++){//偶数找对半下一个(4+1)/2+1 = 3//奇数找对半下两个 (5+1)/2+ 1 = 4q = q->next;}while(q != nullptr){stack[++index] = *q;q = q->next;}//打印栈中的数据
//    while(index != -1){
//        printf("%c ",stack[index--].data);
//    }while(index != -1){if(p->data != stack[index--].data)return 0;p = p->next;    }return 1;
}

时间复杂度:O(n)
空间复杂度:O(n)

3.2 思路2

int judge2(LinkList L, int n){LNode *p = L->next, *q = L->next, *r;for(int i = 1;i < (n+1)/2;i++){q = q->next;}p = q->next;q->next = nullptr;while(p != nullptr){r = p->next;p->next = q->next;q->next = p;p = r;}//printLNode(L); //测试打印栈p = L->next;q = q->next;while(q != nullptr){if(p->data != q->data){return 0;}p = p->next;q = q->next;}return 1;}

时间复杂度:O(n)
空间复杂度:O(1)

3.3 完整例子

#include<iostream>typedef struct LNode{char data;struct LNode *next;
}LNode,*LinkList;//尾插法创建链表
LinkList createList(LinkList &L,int n){//L = (LinkList)malloc(sizeof(LNode));L = new LNode;LNode *s, *r= L;char x[n + 1];scanf("%s", x);int index = 0;while(n--){s = new LNode;s->data = x[index++];r->next = s;r = s;}r->next = nullptr;return L;
}//打印链表
void printLNode(LNode* L){LNode* p = L->next;while(p != nullptr){printf("%c ", p->data);p = p->next;}printf("\n");
}int judge1(LinkList L, int n){LNode* stack = new LNode[n/2];int index = -1;LNode *q = L->next, *p = L->next;for(int i = 1;i < (n+1)/2 + 1;i++){//偶数找对半下一个(4+1)/2+1 = 3//奇数找对半下两个 (5+1)/2+ 1 = 4q = q->next;}while(q != nullptr){//栈中存储数据stack[++index] = *q;q = q->next;}//打印栈中的数据
//    while(index != -1){
//        printf("%c ",stack[index--].data);
//    }while(index != -1){if(p->data != stack[index--].data)return 0;p = p->next;    }return 1;
}int judge2(LinkList L, int n){LNode *p = L->next, *q = L->next, *r;for(int i = 1;i < (n+1)/2;i++){//遍历到后半段的前一个结点q = q->next;}p = q->next;//存储后半段的头指针的下一个结点(以防断链)q->next = nullptr;//(后半段的头指针下一个元素置空)while(p != nullptr){//使用头插法原地逆置r = p->next;//防止断链p->next = q->next;q->next = p;p = r;}//printLNode(L); //测试打印栈p = L->next;q = q->next;while(q != nullptr){if(p->data != q->data){return 0;}p = p->next;q = q->next;}return 1;}int main(){int n;scanf("%d", &n);//单链表长度(即字符串长度 )LNode* L = new LNode[n];createList(L, n);printLNode(L);if(judge1(L, n) == 1) printf("对称链表");else printf("非对称链表");delete[] L;return 0;
}

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

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

相关文章

Linux RPM包安装、卸载和升级(rpm命令)详解

(转载请删除括号里的内容) 下面讲解一下&#xff0c;如何使用 rpm 命令对 RPM 二进制包进行安装、卸载和升级操作。我们以安装 apache 程序为例。 RPM包默认安装路径 通常情况下&#xff0c;RPM 包采用系统默认的安装路径&#xff0c;所有安装文件会按照类别分散安装到下表所…

优漫动游 大厂需要什么样的ui设计师呢?

通常来说大公司UI设计的流程主要是这样的&#xff1a;创意-头脑风暴-策划方案-交互设计&评审-美术设计&评审-开发实施&#xff0c;不过实际上大多数公司都有自己的一套流程&#xff0c;源于公司的基因、公司组织体系、公司领导风格。一起了解大厂需要什么样的ui设计师呢…

谷粒商城第十一天-品牌管理中关联分类

目录 一、总述 二、前端部分 1. 调整查询调用 2. 关联分类 三、后端部分 四、总结 一、总述 之前是在商品的分类管理中直接使用的若依的逆向代码 有下面的几个问题&#xff1a; 1. 表格上面的参数填写之后&#xff0c;都是按照完全匹配进行搜索&#xff0c;没有模糊匹配…

nodejs实现前后端websocket通信+心跳示例

nodejs后端代码 server.js //需要安装ws模块 npm install ws const WebSocket require("ws") const port 8085const ws new WebSocket.Server({port})ws.on("connection", (socket) > {socket.on("message",(message) > {const da…

自定义hook之首页数据请求动作封装 hooks

本例子实现了自定义hook之首页数据请求动作封装 hooks&#xff0c;具体代码如下 export type OrganData {dis: Array<{ disease: string; id: number }>;is_delete: number;name: string;organ_id: number;parent_id: number;sort: number; }; export type SwiperData …

【STM32】简介

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2022博客之星T…

(2)linux虚拟机配置中文输入法和如何下载软件

&#xff08;一&#xff09;配置中文输入法&#xff1a; 1、sudo apt-get install fcitx&#xff0c;安装fcitx框架&#xff0c;安装完成之后&#xff0c;选择该框架 2、接下来输入sudo apt-get install fcitx fcitx-googlepinyin&#xff0c;安装谷歌输入法之后&#xff0c;重…

WebSocket与消息推送

B/S结构的软件项目中有时客户端需要实时的获得服务器消息&#xff0c;但默认HTTP协议只支持请求响应模式&#xff0c;这样做可以简化Web服务器&#xff0c;减少服务器的负担&#xff0c;加快响应速度&#xff0c;因为服务器不需要与客户端长时间建立一个通信链接&#xff0c;但…

Windows - UWP - 网络不好的情况下安装(微软商店)MicrosoftStore的应用

Windows - UWP - 网络不好的情况下安装&#xff08;微软商店&#xff09;MicrosoftStore的应用 前言 UWP虽然几乎被微软抛弃了&#xff0c;但不得不否认UWP应用给用户带来的体验。沙箱的运行方式加上微软的审核&#xff0c;用户使用起来非常放心&#xff0c;并且完美契合Wind…

聚类与回归

聚类 聚类属于非监督式学习&#xff08;无监督学习&#xff09;&#xff0c;往往不知道因变量。 通过观察学习&#xff0c;将数据分割成多个簇。 回归 回归属于监督式学习&#xff08;有监督学习&#xff09;&#xff0c;知道因变量。 通过有标签样本的学习分类器 聚类和…

前端实现文件预览功能

前端实现文件预览功能 ❝ 需求&#xff1a;实现一个在线预览pdf、excel、word、图片等文件的功能。 介绍&#xff1a;支持pdf、xlsx、docx、jpg、png、jpeg。 以下使用Vue3代码实现所有功能&#xff0c;建议以下的预览文件标签可以在外层包裹一层弹窗。 ❞ 图片预览 iframe标签…

前端杂项-个人总结八股文的背诵方案

个人总结八股文的背诵方案 URL到显示网页的过程 浏览器解析URL&#xff0c;获取协议&#xff0c;主机名&#xff0c;端口号&#xff0c;路径等信息&#xff0c;并通过DNS查询将主机名转换为对应的IP地址浏览器与服务器建立TCP&#xff0c;进行三次握手。浏览器向服务器发送HT…

枚举缓存工具

此文章为笔记&#xff0c;为阅读其他文章的感受、补充、记录、练习、汇总&#xff0c;非原创&#xff0c;感谢每个知识分享者。 文章目录 1. 背景2. 枚举缓存3. 样例展示4. 性能对比5. 总结 本文通过几种样例展示如何高效优雅的使用java枚举消除冗余代码。 1. 背景 枚举在系统…

不需要用@Param注解与需要用@Param注解的情况

不需要用Param注解&#xff1a; 1.只有一个参数时&#xff0c;不需要用Param注解。此时在不使用Parma注解的情况下&#xff0c;sql语句中的参数占位符名称直接使用任何名称均可&#xff1b; 2.方法参数是引用数据类型的情况下&#xff0c;不需要用Param注解。 需要用Param注…

QT生成Word PDF文档

需求&#xff1a;将软件处理的结果保存为一个报告文档&#xff0c;文档中包含表格、图片、文字&#xff0c;格式为word的.doc和.pdf。生成word是为了便于用户编辑。 开发环境&#xff1a;qt4.8.4vs2010 在qt的官网上对于pdf的操作介绍如下&#xff1a;http://qt-project.org/…

华为认证 | H3C厂商证书,含金量有多高?

华为H3C认证是中国第一家建立国际规范的完整的网络技术认证体系&#xff0c;它的作用是不言而喻的&#xff0c;工作上它能给你带来技能加分。 那么H3C认证网络工程师证书含金量怎么样呢&#xff1f;下面我们就来了解一下吧。 01 H3C认证网络工程师证书含金量 全面覆盖H3C相关…

微服务Eureka注册中心

目录 一、Eureka的结构和作用 二、搭建eureka-server 三、服务注册 四、服务发现 假如我们的服务提供者user-service部署了多个实例&#xff0c;如图&#xff1a; 存在的问题&#xff1a; order-service在发起远程调用的时候&#xff0c;该如何得知user-service实例的ip地址…

深度学习快速入门系列---损失函数

在深度学习中&#xff0c;损失函数的作用是量化预测值和真实值之间的差异&#xff0c;使得网络模型可以朝着真实值的方向预测&#xff0c;损失函数通过衡量模型预测结果与真实标签之间的差异&#xff0c;反映模型的性能。同时损失函数作为一个可优化的目标函数&#xff0c;通过…

10个微服务设计模式

微服务设计模式是一种指导微服务架构设计和开发的一系列原则和实践。微服务设计模式的目的是为了解决微服务架构中遇到的一些常见的问题和挑战&#xff0c;比如服务划分、服务通信、服务治理、服务测试等。微服务设计模式可以帮助我们构建出高效、可靠、可扩展、可维护的微服务…

九耶丨阁瑞钛伦特-井字棋html5代码

你想了解关于井字棋&#xff08;Tic-Tac-Toe&#xff09;的HTML代码吗&#xff1f;以下是一个简单的井子棋的HTML代码示例&#xff1a; <!DOCTYPE html> <html> <head><title>Tic-Tac-Toe</title><style>.board {display: flex;flex-wrap…