对于单链表来说,判断回文最简单的方法就是遍历链表,将链表中的元素复制到数组中,然后对数组进行判断是否是回文数组,但是这不符合O(1)的空间复杂度. 由于空间复杂度的要求,需要就地操作链表,不能开辟多余的空间来进行处理,因此引入快慢指针来进行操作. 快慢指针: slow 和 fast,每次slow指针前进一步,fast指针前进两步,当遇到指针为空时说明遍历链表完成,此时也就可以找到链表的中心位置. 注意,由于链表的长度可能是奇数也可能是偶数,因此应该做一个判断. 找到链表的中心后,把链表的后半部分…
学习数据结构的时候遇到一个经典的回文链表问题 对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构. 如果有链表反转的基础,实现链表回文判断就简单的多,如果对反转链表不熟悉,可以参考这篇博客. 思路很简单,先找到链表的中间Node,采用的快慢指针法. 慢指针一次走一步,快指针一次走两步,当快指针触底的时候,慢指针到达了重点,如果链表总数是偶数,则慢指针停在相对左边的Node上. 找到中点后,对中点后面的链表进行反转. 从头尾开始向中间移步,每次比较是…
所谓回文字符串,就是正读和反读都一样的字符串,比如"level"或者"noon"等等就是回文串.即是对称结构 判断回文字符串 方法一: def is_palindrome(s): return True if s == s[::-1] else False 方法二: def is_palindrome(s): length = len(s) if not length: # 空字符串 return True mid_index = length // 2 # 如果s…
题目描述: 对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构. 给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构.保证链表长度小于等于900. 测试样例: 1->2->2->1 返回:true 思路: 由于空间复杂度要求为O(1),也就是说临时占用空间和输入数据规模无关,因此无法利用数组或者是栈进行判断.因此先找到中间位置将后半部分指针翻转,然后两端分别比较.注意这种方法会修改原链表,但是空间复杂度要求为O(1)也只能这…
题目 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题? 解答 两种方法: 遍历链表,用数组存值,再比较.时间复杂度O(n),空间复杂度O(n) 指针法:找到中点,反转中点之后的链表,再比较.时间复杂度O(n),空间复杂度O(1) 通过代码如下: # Definition for singly-linked list.…
目录 1 问题描述 2 解决方案   1 问题描述 给定一个字符串,如何判断这个字符串是否是回文串? 所谓回文串,是指正读和反读都一样的字符串,如madam.我爱我等. 2 解决方案 解决上述问题,有两种方法可供参考: (1)从字符串两头往中间扫: (2)从字符串中间往两头扫. 具体代码如下: package com.liuzhen.string_1; import java.util.Scanner; public class StringPalindrome { //方法1:两头往中间扫 p…
给定一个单链表,只给出头指针h: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少? 解法: 1.对于问题1,使用追赶的方法,设定两个指针slow.fast,从头指针开始,每次分别前进1步.2步.如存在环,则两者相遇:如不存在环,fast遇到NULL退出. 2.对于问题2,记录下问题1的碰撞点p,slow.fast从该点开始,再次碰撞所走过的操作数就是环的长度s. 3.问题3:有定理:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分…
1 问题描述 给定一个字符串,如何判断这个字符串是否是回文串? 所谓回文串,是指正读和反读都一样的字符串,如madam.我爱我等. 2 解决方案 解决上述问题,有两种方法可供参考: (1)从字符串两头往中间扫: (2)从字符串中间往两头扫. 具体代码如下: package com.liuzhen.string_1; import java.util.Scanner; public class StringPalindrome { //方法1:两头往中间扫 public boolean IsPal…
/ 判断一个字符是否为回文,abcba是回文,. /*function fn2(str){ var str1=''; for(var i=str.length-1;i>=0;i--){ str1+=str[i]; } //console.log(str,str1); if(str===str1){ console.log('是回文'); }else{ console.log('不是回文'); } } fn2('abcba'); function fn3(str){ //abcbagh 0 4 1…
通过栈与队列相关内容的学习,我们知道,栈是"先进后出"的线性表,而队列是"先进先出"的线性表.可以通过构造栈与队列来实现在这一算法.将要判断的字符序列依次压栈和入队.然后依次出栈和出队,通过比较出栈的字符序列与出队的字符序列是否相同来判断读入的字符序列是否为回文序列.如果全部相同则是回文序列,否则不是回文序列. 使用链式栈实现这一算法. #include <stdio.h> #include <stdlib.h> #include "…