[算法]回文检测

链表的回文检测

有关链表的回文检测,用到的就是链表操作中常常用到的双指针的方法,找到链表的中点位置,然后依次对比两边的结点。但是在找链表的中点的时候要注意链表的总个数是偶数或者奇数的两种情况

1.找链表的中点位置,并把中点以前的各个结点的值存入到栈中。
2.针对偶数或者奇数个链表结点,对中点结点做一个小的调整。
3.依次对比栈中结点的值后链表后半部分结点的值是否相等,决定是否是回文结构。

代码实现:

bool isPalindrome(ListNode* head)
{
	bool isPalindrome = true;
	if(head == NULL)
	{
		return true;
	}

	stack<int> s;

	//找到链表的中点
	ListNode *fast = head;
	ListNode *low = head;
	while(fast != NULL && fast->next != NULL)
	{
		s.push(low->val);
		fast = fast->next->next;
		low = low->next;
	}//while
	if(fast != NULL)
	{
		low = low->next;
	}

	//对比前后两段链表的内容
	while(low != NULL)
	{
		if(low->val != s.top())
		{
			isPalindrome = false;
			break;
		}
		low = low->next;
		s.pop();
	}//while

	return isPalindrome;
}

这种方法能够实现O(n)的时间复杂度,但是他的空间复杂度同样是O(n).

链表判断回文O(1)空间复杂度

对链表的后半部分逆序,这样就能一次对比前半部分和后半部分的不同了。

bool isPalindrome(ListNode* head)
{
	if(head == NULL || head->next == NULL)
		return true;

	ListNode *fast = head;
	ListNode *low = head;

	//利用快慢指针找到链表的中点
	while(fast != NULL && fast->next != NULL)
	{
		fast = fast->next->next;
		low = low->next;
	}
	if(fast != NULL)
	{
		low = low->next;
	}

	//逆序链表的后半部分
	ListNode dummy(-1);
	dummy.next = low;
	while(low->next != NULL)
	{
		ListNode *tmp = low->next;
		low->next = tmp->next;
		tmp->next = dummy.next;
		dummy.next = tmp;
	}//while

	//对比前后两部分
	low = dummy.next;
	fast = head;
	while(low != NULL)
	{
		if(fast->val != low->val)
			return false;
		low = low->next;
		fast = fast->next;
	}

	return true;
}

  

时间: 2024-10-27 21:27:50

[算法]回文检测的相关文章

C# 自定义堆栈进行回文检测的代码

在研发之余,将做工程过程中比较重要的一些内容备份一下,如下的内容内容是关于C# 自定义堆栈进行回文检测的内容,希望对各朋友也有用. using System; using System.Collections; namespace CStack { class Program { static void Main(string[] args) { CStack alist = new CStack(); string ch; string word = "上海自来水来自海上"; boo

hdu4513--Manacher算法--回文串的O(n)算法

腾讯的比赛的题目的质量都很高 特别喜欢这题目背景 每题都很有意思 这题 也蛮难的 因为n太多了 一定要用O(n)的回文串算法来求 我是在这里学习的  传送 一般的话 都是char数组 使用特殊字符 表示插入 开头和末尾也是特别的字符 末尾的话是 '\0' 这边的话 因为是Int数组  要注意下 0 和 末尾不能取相同值 这样会错的 插入的值 一定要在这个Height范围外 1 #include <iostream> 2 #include <algorithm> 3 using na

算法——回文解密,判断一个素组是否为回文

算法中,队列是先进先出原则,而栈是后进先出原则,栈限定只能在一端进行插入和删除操作,而栈的作用有哪些? 可以通过一组回文字符串来看:"xyzyx",同过栈来判断字符串是否是回文 案例:package test; /** * @author dayu 解密回文--栈 * @version 创建时间:2017年11月13日 下午2:15:01 * 类说明 */ public class zhan { //回文--一定有对称轴,所以一定是单数 public static void main(

一天一算法:回文判断

问题描述: 什么是回文?如,aha, adda,单ahah就不是回文,等等 如何判断一串字符串是回文呢? 这里的想法是:我们利用队列的方式,找到字符的中间的位置,将中间字符之前的全部入栈,然后全部出栈,与中间字符之后的字符进行比较,如果全部一样,那么就是回文. 代码: #include<iostream> #include <queue> #include <string.h> using namespace std; int main() { char str[] =

算法——回文串专题

双重回文数(复杂版) 题目链接:https://www.luogu.org/problemnew/show/P1207 回文串分割 题目链接:https://www.lintcode.com/problem/palindrome-partitioning/description 原文地址:https://www.cnblogs.com/czc1999/p/10362872.html

算法——回文(palindrome)

# 10-palindrome.py import string def is_palindrome(text: str) -> bool: '是否为回文' # 1.先去除标点符号以及空格,并将所有字母小写化 result = '' for i in range(len(text)): if not text[i] in string.punctuation + ' ': result += text[i].lower() print(result) # 2.判断是否为回文 n = len(re

LeetCode 5 迅速判断回文串的曼切斯特算法

题意 Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000. Link: https://leetcode.com/problems/longest-palindromic-substring/ 翻译 给定一个字符串s,要求它当中的最长回文子串.可以假设s串的长度最大是1000. 样例 Example 1: Input:

Manacher 入门+模板 回文串专用算法

Manacher 算法 回文串专用算法 manacher 人名,该算法的发明者.palindrome名词:回文. 博客推荐 https://www.cnblogs.com/lykkk/p/10460087.html,比较简洁,代码清晰. https://www.cnblogs.com/cloudplankroader/p/10988844.html, 一些细节的东西比较讲解比较细. 模板 //预处理函数,使得处理后的字符串长度为奇数,并且有一些比较好的性质 int init(char* s, c

7.Deque的应用案例-回文检查

- 回文检测:设计程序,检测一个字符串是否为回文. - 回文:回文是一个字符串,读取首尾相同的字符,例如,radar toot madam. - 分析:该问题的解决方案将使用 deque 来存储字符串的字符.我们从左到右处理字符串,并将每个字符添加到 deque 的尾部.在这一点上,deque 像一个普通的队列.然而,我们现在可以利用 deque 的双重功能. deque 的首部保存字符串的第一个字符,deque 的尾部保存最后一个字符.我们可以直接删除并比较首尾字符,只有当它们匹配时才继续.如