数据结构--链表--判断一个字符串是否为回文串(单向链表,双向链表)

回文串为首尾对称的字符串:

如a,aba,abba等

单链表思路

1.将字符读入链表

2.找到链表中点

3.将链表从中点断开成2条,将后半条反转

4.比较两条链表是否相等(比较次数以少的为准(长度为奇数时))

双向链表思路

1.将字符读入链表

2.找到链表尾节点

3.从首尾依次向中间比较

(双向链表可以双向移动,代码上更简洁,见下面)

 

单链表C++代码实现

//
// Created by mingm on 2019/3/13.
//
#include <iostream>
#include <math.h>
using namespace std;
struct Node //节点
{char data;Node* next;Node():next(NULL){}Node(char &ch):data(ch),next(NULL){}~Node(){}
};
class SLinkedList   //链表
{Node* p_head;
public:SLinkedList()   //构造函数{p_head = new Node;  //带头链表
//        cout << "new 1" << endl;}~SLinkedList(){ erase(); }  //析构函数void erase(){Node *del_tempNode, *tempNode;del_tempNode = p_head;while(del_tempNode != NULL) {tempNode = del_tempNode -> next;delete del_tempNode;
//            cout << "delete 1" << endl;del_tempNode = tempNode;}}void set_head(Node* p){p_head = p;}Node* get_head(){return p_head;}size_t get_len()    //求链表长度{size_t len = 0;Node* p = p_head;while(p){len++;p = p->next;}return len;}void delHeadSentinel()  //删除链表表头哨兵{Node* del = p_head;p_head = p_head->next;delete del; //删除链表的表头哨兵
//        cout << "delete head 1" << endl;}Node* reverse() //链表反转{if(p_head == NULL || p_head->next == NULL)return NULL;else{Node *prevNode, *nextNode, *tempNode;prevNode = p_head;nextNode = prevNode->next;prevNode->next = NULL;while(nextNode != NULL){tempNode = nextNode->next;nextNode->next = prevNode;prevNode = nextNode;nextNode = tempNode;}p_head = prevNode;return p_head;}}Node* findMiddle()  //查找链表中点{size_t len = get_len();Node* tempNode = p_head;size_t n = ceil(double(len)/2);for(size_t i = 1; i < n; ++i){tempNode = tempNode->next;}return tempNode;}
};int main()
{while(true){cout << "-----------------------------------" << endl;char ch;cin.clear();cout << "enter a word, is it a palindrome ?" << endl;if((ch = cin.get()) && ch == '\n'){cout << "empty word !" << endl;continue;}SLinkedList charList, backHalfOfList;   //链表(前半部分链表),后半部分链表Node* tempNode = charList.get_head();while(ch != '\n')   //把单词存进链表charList{Node* newNode = new Node(ch);
//            cout << "new insert 1" << endl;tempNode->next = newNode;tempNode = newNode;ch = cin.get();}charList.delHeadSentinel();         //链表表头删除backHalfOfList.delHeadSentinel();   //把空表头哨兵节点删除Node* endOfFrontList = charList.findMiddle();    //链表的中点是前一半的结束节点Node* backListHead = endOfFrontList->next;    //中点的下一个节点是后半部分的开始endOfFrontList->next = NULL;                //把前半部分链表断开backHalfOfList.set_head(backListHead);    //把后半部分的链表表头地址设置好backHalfOfList.reverse();                //后半部分链表反转size_t n = backHalfOfList.get_len();    //求后半部分链表长度Node *frontList = charList.get_head();    //找到前半部分的开头Node *backList = backHalfOfList.get_head();    //后半部分的开头(反转后的)bool answer = false;if(backList == NULL)    //如果后半部分为空,说明只有一个字符answer = true;else{for(size_t i = 0; i < n; ++i)    //比较数据是否相同{if(frontList->data != backList->data){answer = false;break;}else{answer = true;frontList = frontList->next;backList = backList->next;}}}if(answer)cout << "the word is a palindrome." << endl;elsecout << "the word is not a palindrome." << endl;char conti;cout << "continue to check? (y/n)" << endl;cin >> conti;cin.get();if(conti == 'y' || conti == 'Y'){continue;}elsebreak;}return 0;   
}

Valgrind检查结果

双向链表C++代码实现

//
// Created by mingm on 2019/3/16.
//
#include <iostream>
#include <math.h>
using namespace std;
struct Node //节点
{char data;Node *prev, *next;Node():prev(NULL),next(NULL){}Node(char &ch):data(ch),prev(NULL),next(NULL){}~Node(){}
};
class SLinkedList   //链表
{Node* p_head;
public:SLinkedList()   //构造函数{p_head = new Node;  //带头链表
//        cout << "new 1" << endl;}~SLinkedList(){ erase(); }  //析构函数void erase(){Node *del_tempNode, *tempNode;del_tempNode = p_head;while(del_tempNode != NULL) {tempNode = del_tempNode -> next;delete del_tempNode;
//            cout << "delete 1" << endl;del_tempNode = tempNode;}}void set_head(Node* p){p_head = p;}Node* get_head(){return p_head;}Node* get_tail()    //求链表尾节点{Node* p = p_head;if(p_head == NULL)return NULL;while(p->next){p = p->next;}return p;}void delHeadSentinel()  //删除链表表头哨兵{Node* del = p_head;p_head = p_head->next;p_head->prev = NULL;delete del; //删除链表的表头哨兵
//        cout << "delete head 1" << endl;}
};int main()
{while(true){cout << "-----------------------------------" << endl;char ch;cin.clear();cout << "enter a word, is it a palindrome ?" << endl;if((ch = cin.get()) && ch == '\n'){cout << "empty word !" << endl;continue;}SLinkedList charList;   //链表Node* tempNode = charList.get_head();while(ch != '\n')   //把单词存进链表charList{Node* newNode = new Node(ch);
//            cout << "new insert 1" << endl;tempNode->next = newNode;   //前面节点后指针指向后面newNode->prev = tempNode;   //后面节点前置指针指向前面tempNode = newNode;ch = cin.get();}charList.delHeadSentinel();     //链表空表头删除Node *front = charList.get_head();  //定义一个从头开始的指针Node *back = charList.get_tail();   //定义一个从尾部开始的指针bool answer = false;if(front == back)    //说明只有一个字符answer = true;else{while(front != back)   //比较数据是否相同{if(front->data != back->data){answer = false;break;}else{answer = true;front = front->next;back = back->prev;}}}if(answer)cout << "the word is a palindrome." << endl;elsecout << "the word is not a palindrome." << endl;char conti;cout << "continue to check? (y/n)" << endl;cin >> conti;cin.get();if(conti == 'y' || conti == 'Y'){continue;}elsebreak;}return 0;   
}

Valgrind检查结果 

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

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

相关文章

丁香园在语义匹配任务上的探索与实践

前言语义匹配是NLP领域的基础任务之一&#xff0c;直接目标就是判断两句话是否表达了相同或相似意思。其模型框架十分简洁&#xff0c;通常包含文本表示和匹配策略两个模块&#xff0c;因而很容易扩展到相关应用场景&#xff0c;如搜索、推荐、QA系统等。此类模型通常依赖数据驱…

19本高并发编程书籍推荐

Java并发编程实战 &#xff08;java并发的圣经&#xff09; 多处理器编程的艺术 &#xff08;并发编程的各种算法&#xff0c;java实现&#xff0c;有点难度&#xff09; 并发的艺术 &#xff08;多核处理器的共享内存模型中的各种算法&#xff09; Java虚拟机并发编程 &#x…

Wasserstein metric的通俗解释

Wasserstein metric的通俗解释​关注他166 人赞同了该文章本文收录在无痛的机器学习第二季目录。Wasserstein GAN可以算是GAN界的一大突破了&#xff0c;有关它的介绍和使用心得的文章也已经满天飞了&#xff0c;感兴趣的童鞋随便一搜就能好多&#xff0c;今天就不说太多大家说…

肖仰华 | 领域知识图谱落地实践中的问题与对策

本文转载自公众号&#xff1a;知识工场。肖仰华教授2万字长文为您深度剖析领域知识图谱&#xff0c;对领域知识图谱技术与落地应用中的一系列关键问题做了系统的梳理与解答。肖仰华博士&#xff0c;复旦大学计算机科学与技术学院教授&#xff0c;博士生导师&#xff0c;知识工场…

数据结构--链表--约瑟夫环问题(单向循环链表)

问题&#xff1a;一群人站成一个圆圈&#xff0c;从一个人开始报数&#xff0c;1&#xff0c; 2 &#xff0c;。。。m&#xff0c;报到m的拉出去砍了&#xff0c;求被砍的顺序和最后一个活下来的。 利用单向循环链表实现 C代码如下&#xff1a;&#xff08;参考书籍&#xff…

献给新一代人工智能后浪——《后丹》

一只小狐狸带你解锁炼丹术&NLP秘籍视频来源&#xff1a;AIZOO《后丹》那些口口声声&#xff0c;掉包调参侠的人&#xff0c;应该看着你们像我一样&#xff0c;我看着你们&#xff0c;满怀羡慕。人类积攒了几十年的科技&#xff0c;所有的模型、数据、框架和显卡&#xff0c…

神经网络算法学习---mini-batch++++mini-batch和batch的区别

Batch_Size&#xff08;批尺寸&#xff09;是机器学习中一个重要参数&#xff0c;涉及诸多矛盾&#xff0c;下面逐一展开。 首先&#xff0c;为什么需要有 Batch_Size 这个参数&#xff1f; Batch 的选择&#xff0c;首先决定的是下降的方向。如果数据集比较小&#xff0c;完全…

进阶阿里架构师:算法、编程语言、数据库、架构设计!书单推荐!

阿里架构师必读书单 数据结构与算法&#xff1a;算法、算法导论等。 编程语言&#xff1a;java编程思想、java核心技术等 模式与设计&#xff1a;设计模式、代码重构、深入理解java虚拟机 数据库&#xff1a;mysql优化、oracle、redis实战、mongodb权威指南等。 架构设计&a…

刘知远 | 语义表示学习

本文转载自公众号&#xff1a;人工智能图灵。刘知远&#xff0c;清华大学计算机系副教授、博士生导师。主要研究方向为表示学习、知识图谱和社会计算。2011年获得清华大学博士学位&#xff0c;已在ACL、IJCAI、AAAI等人工智能领域的著名国际期刊和会议发表相关论文60余篇&#…

数据结构--链表--LRU缓存

LRU&#xff08;Least Recently Used&#xff09;缓存策略&#xff1a; 通俗的讲就是&#xff0c;最近使用的放在最前面&#xff0c;不经常使用的放后面&#xff0c;满了就删除 C代码实现 //用单链表实现LRU策略 2019.3.17 #include <iostream> #include <string…

透过现象看机器学习:奥卡姆剃刀,没有免费的午餐,丑小鸭定理等

一只小狐狸带你解锁炼丹术&NLP 秘籍本文对PAC学习理论、没有免费的午餐定理、丑小鸭定理、奥卡姆剃刀原理等机器学习中有名的理论或定理进行了详细的梳理。在机器学习中&#xff0c;有一些非常有名的理论或定理&#xff0c;这些理论不仅有助于我们从本质理解机器学习特性&a…

NAACL 2019最佳论文:量子概率驱动的神经网络

今天要介绍的文章与当前大火的 BERT 同获最佳论文&#xff0c;摘得 NAACL 2019 最佳可解释NLP论文&#xff08;Best Explainable NLP Paper&#xff09;。NAACL 与 ACL 和 EMNLP 并称之为 NLP 三大顶会&#xff0c;去年 ELMO 获得 outstanding paper&#xff0c;今年一共有五篇…

互联网优秀架构师必读书单V2.0

一篇文章搞懂高级程序员、架构师、技术经理、技术总监、CTO&#xff0c;从薪资到技能要领的区别&#xff0c;我提到了架构师的准确定义和所需工作年限&#xff0c;以及最重要的架构师的职责等。 从程序员进阶到架构师&#xff0c;6大核心技能详解&#xff0c;提到了从程序员进…

领域应用 | NLP 和知识图谱:金融科技领域的“双子星”

本文转载自公众号&#xff1a;恒生技术之眼。自然语言处理&#xff08;Natural Language Processing, NLP&#xff0c;语义计算&#xff09;和知识图谱&#xff08;Knowledge Graph, KG&#xff0c;知识计算&#xff09;作为认知智能的关键技术&#xff0c;正成为智能金融浪潮中…

数据结构--单链表single linked list(无表头哨兵)重写

针对上次写的单链表中不足的地方进行修改&#xff1a; 1.构造函数需要让用户输入&#xff08;bad&#xff09; 2.函数功能不单一&#xff0c;既操作链表&#xff0c;还打印输出&#xff08;bad&#xff09; 代码链接&#xff08;包含无头\有头单链表、循环单链表、双链表、循…

别再蒸馏3层BERT了!变矮又能变瘦的DynaBERT了解一下

一只小狐狸带你解锁炼丹术&NLP秘籍神经网络模型除了部署在远程服务器之外&#xff0c;也会部署在手机、音响等智能硬件上。比如在自动驾驶的场景下&#xff0c;大部分模型都得放在车上的终端里&#xff0c;不然荒山野岭没有网的时候就尴尬了。对于BERT这类大模型来说&#…

LS-GAN:把GAN建立在Lipschitz密度上

最近很多关心深度学习最新进展&#xff0c;特别是生成对抗网络的朋友可能注意到了一种新的GAN-- Wasserstein GAN。其实在WGAN推出的同时&#xff0c;一种新的LS-GAN (Loss Sensitive GAN&#xff0c;损失敏感GAN)也发表在预印本 [1701.06264] Loss-Sensitive Generative Adver…

java程序员必看经典书单,以及各个阶段学习建议

最近&#xff0c;部分读者一直希望我给大家推荐java程序员必读书籍&#xff0c;以及java程序员每个阶段的学习建议。 今天&#xff0c;先给大家推荐1.0版本&#xff0c;后面再不断完善程序员必读书籍2.0版本。 希望&#xff0c;你早日成为牛逼的程序员。 程序员进阶之路 上图是…

数据结构--链表--单链表归并排序mergesort

思路&#xff1a; 1.将链表的中点找到&#xff0c;对其切分成2条 2.继续步骤1&#xff0c;切成4条&#xff0c;8条。。。,直至每段链表只有1个元素 3.归并操作&#xff0c;对两两链表进行合并排序&#xff0c;并返回回并后的链表的头结点&#xff0c;依次向上递归回去 C代码…

我们的实践:事理图谱,下一代知识图谱

原文链接&#xff1a;https://mp.weixin.qq.com/s/iLfXeVeWE5CCs_sM_NAOSw 一、人工智能与认知智能 当前人工智能时代下&#xff0c;机器与人类之间的博弈一直在进行着。如图1所示&#xff0c;从1956年达特茅斯会议的召开标志人工智能诞生到深度学习模型在若干人工智能领域大规…