数据结构之回文专题(Palindrome)
来源:互联网 发布:查看ftp使用的端口 编辑:程序博客网 时间:2024/06/05 06:48
今日整理数据结构时正好遇到了回文专题,接下来我们会选典型的回文数、回文单链表、回文子串进行探讨,编程语言随机为C或者java. 首先我们来看回文数,如何判断一个整数位回文数呢?小白我的理解应该是:121,212,313,2222,44444,之类的整数应该为回文数。现在我们要用code来判断回文数。 分析:要考虑溢出情况,我们在进行数字处理时肯定会用到除法、求余等操作。代码比较简单直接看下面。
bool isPalindromeNumber(int x) { int a = x; int h = 1; if(a < 0) { return false; } // 找到最高位的h while(a/h >=10) { h = h * 10; } while(a > 0) { // 首位和末尾数值对比 if(a/h)!= a %10){ return false; } a = a %10; // 去掉最低位 a = a % h ; // 去掉最高位 h = h / 100; } return true; }
这样整个过程结束,注意我们是怎么样计算出 最高的h位以及 怎么将整数a去头去尾。
接下来看:回文单链表
如何判断一个单链表是否为回文单链表呢,网上有很多种解法,类似于用栈,以及数组存储法,此处不做过多讨论,读者可自行分析。我们这里采用链表翻转法。
分析: 我们找到链表的中间点,然后开始翻转后半部分链表,再比较前半部分和后半部分就可以得出结果,首先我们要解决链表反转问题。
struct ListNode { int val; struct ListNode *next; } struct ListNode* reverseList(struct ListNode* head) { if(NULL == head) { return head; } struct ListNode* p = head; p = head->next; head->next = NULL; // 注意头结点的尾指针 while(p!=NULL){ struct ListNode* ptmp = p->next; p->next = head; head = p; p = ptmp; } return head; } 好了,齐活了,链表翻转搞定
现在正式开始解决回文链表判定的函数,那么问题来了,怎么搞呢,怎么找到链表的中间结点呢,这里我们设置两个指针一个快一个慢。
bool isPalindromLinkList(struct ListNode* head){ if(head || head ->next){ return true; } ListNode *slow,*fast; slow = fast = head; while(fast&& fast->next){ slow = slow ->next; fast = fast->next->next; } if(fast){ slow->next = reverseList(slow->next); slow = slow->next; } else{ slow = reverseList(slow); } while(slow){ if(head->val != slow->val){ return false; } slow = slow ->next; head = head->next; } return true;}搞定了,是不是很简单的对了,为什么我要对fast是否为空进行判断呢?仔细想想。
0 0
- 数据结构之回文专题(Palindrome)
- LeetCode之Palindrome Number(回文数)
- Palindrome(回文串)
- LeetCode OJ 之 Palindrome Number(回文数字)
- LeetCode OJ 之 Valid Palindrome(回文字符串)
- LeetCode OJ 之 Palindrome Partitioning (字符串的回文分割)
- 数据结构之回文字符串
- POJ1159:Palindrome(回文数)
- poj1159(Palindrome+回文串)
- palindrome-number(回文数)
- Palindrome Number(回文数字)
- 回文排列(Palindrome Permutation)
- 字符串回文判断(palindrome)
- Palindrome Function(回文数)
- 125. Valid Palindrome(回文)
- 回文数字(Palindrome Number)
- Palindrome回文
- Palindrome 回文
- SEO干货分享-SEO整站优化的优点
- 文章标题
- 常用正则表达式—邮箱(Email)
- Servlet的执行过程和生命周期
- 2972: C语言习题5.24--文件操作1
- 数据结构之回文专题(Palindrome)
- 安卓推送技术手册——使用透传消息的正确姿势
- 复习下单例设计模式(实现数据库连接,以免多次实例化)
- Python对excel写入数据操作实例代码(改进无法合并最后一组数据的问题)
- Android camera 设置聚焦区域
- PAT乙级1041-1045
- 【Jenkins】Jenkins入门系列之——02第二章 Jenkins安装与配置
- java中用split()方法分割字符串--用特殊字符分割得不到想要的结果的情况
- JAVA