摘要:先实现栈操作遍历链表,把每个节点都进中然后再遍历链表,同时节点依次出栈,二者进行比较。
?作者简介:大家好,我是车神哥,府学路18号的车神?
?个人主页:应无所住而生其心的博客_府学路18号车神_CSDN博客
?点赞➕评论➕收藏 == 养成习惯(一键三连)?
?本系列主要以刷LeetCode(力扣)网站的各类题为标准,实现自我能力的提升为目标⚡
⚡希望大家多多支持?~一起加油 ?
- 专栏《LeetCode天梯》
周四,今天中午终于拥有了一个久违的午休了,老黄说我睡到打呼噜,连续加班几天了,赶项目,做实验,写论文,哎,对了,官方送的CSDN的水杯到了,应该是C站人手一个吧,哈哈哈,一杯茶,坐下就是一下午,加油吧!
每天进步一点点,就已经很棒很棒了,坚持坚持,不要太累,拒绝内卷,从每日一练开始,每天十分钟,快乐生活一辈子!疫情依旧反复,大家带好口罩啊~ 继续继续,来,今天和车神哥一起来提升自己的Python编程和面试能力吧,刷天梯~
放上我拍的Photo吧!~
每日推荐一首歌:夏天的风——火羊瞌睡了
以下为我的天梯积分规则:
每日至少一题:一题积分+10分
若多做了一题(或多一种方法解答),则当日积分+20分(+10+10)
若做了三道以上,则从第三题开始算+20分(如:做了三道题则积分-10+10+20=40;做了四道题则积分–10+10+20+20=60)
初始分为100分
若差一天没做题,则扣积分-10分(周六、周日除外注:休息)
坚持!!!
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
示例1:
输入:head = [1,2,2,1]
输出:true
示例2:
输入:head = [1,2]
输出:false
提示:
分析:
首先要明白一点回文链表是什么,回文链表就是以链表中间为中心点两边对称。
平时比较常见的是字符串回文串,我们使用双指针,一直指向首,另一个指向尾部,这样往中间一直走一直比对,全部相同则返回True,不同则False。
由于本题判断的是链表,且是单向链表,只能从前往后访问,不能从后往前访问,所以使用判断字符串的那种方式是行不通的。
但是我们可以通过首先寻找到中间的节点,然后再将后半部分节点进行反转操作,再将两半部分链表进行比对就OK了。
具体的借用下大佬的图:
class Solution: def isPalindrome(self, head: ListNode) -> bool: # 双指针 fast = head slow = head if not head or not head.next: return True # 若fast不为空值,则链表的长度为奇数 # if fast != None: # slow = slow.next # 反转后半部分链表 def reversenode(head): out = None while head: next = head.next head.next = out out = head head = next return out # 通过快慢指针找到中点 while fast and fast.next: fast = fast.next.next slow = slow.next slow = reversenode(slow) # fast = head while slow and head: # 依次比较节点值是否相同 if head.val != slow.val: return False # else: head = head.next slow = slow.next return True
真的,真的,真的好慢呀!~
再试试递归法~
可以对链表逆序操作:
def reverseListNode(head): if head == None: return # 终止条件 pre = None pre = reverseListNode(head.next) return pre
引用一下官方的代码(主要是较为优雅),直接上代码:
class Solution: def isPalindrome(self, head: ListNode) -> bool: # 递归 self.front_pointer = head def re_check(current_node=head): if current_node is not None: if not re_check(current_node.next): return False if self.front_pointer.val != current_node.val: # 比较 return False self.front_pointer = self.front_pointer.next return True return re_check()
说实话,这个递归更慢,下面再试一下栈!递归有点难以理解,建议慢慢思考!~
利用先进后出的思想,将其放在栈中,然后再一个一个出站,就实现了链表从后往前访问了。
其中还可以用一个简单的,将链表的值放在list中,再对数组进行反转,再比对反转后有无相同。
先实现栈操作:
遍历链表,把每个节点都Push进stack中;然后再遍历链表,同时节点依次出栈,二者进行比较。
class Solution: def isPalindrome(self, head: ListNode) -> bool: stack = [] # Push 操作 current_node = head while current_node: stack.append(current_node) current_node = current_node.next # POP + Compare 删除和比较 node = head while stack: node2 = stack.pop() # 删除最后一个,将其删除值赋值给node2 if node.val != node2.val: return False node = node.next return True
利用栈操作,比递归快很多,哈哈哈!
接着上面的,我们可以将链表值直接存入新的数组中,然后再对数组反转,将二者进行比对,如果相同则True,否则False。
这思想好像是最简单的了!!!
哈哈哈
class Solution: def isPalindrome(self, head: ListNode) -> bool: # 数组 sav = [] # 设置空list while head: # 存入list sav.append(head.val) head = head.next return sav == sav[::-1]
速度又提升了耶!~
今天用了四种方法,加油呀!!
准备又要开始做论文实验了o(╥﹏╥)o,谁来帮帮我呀!~
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnarn7/
来源:力扣(LeetCode)
今日得分:+10+10+20+20
总得分:590加油!!!
❤坚持读Paper,坚持做笔记,坚持学习,坚持刷力扣LeetCode❤!!!
坚持刷题!!!打天梯!!!
⚡To Be No.1⚡⚡哈哈哈哈
⚡创作不易⚡,过路能❤关注、收藏、点个赞❤三连就最好不过了
ღ( ´・ᴗ・` )
❤
『
我从来不相信什么懒洋洋的自由,我向往的自由是通过勤奋和努力实现的更广阔的人生,那样的自由才是珍贵的、有价值的;我相信一万小时定律,我从来不相信天上掉馅饼的灵感和坐等的成就。做一个自由又自律的人,靠势必实现的决心认真地活着。
』
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/123962.html
摘要:示例输入输出示例输入输出示例输入输出提示双指针法分析根据题干的要求,我们需要删除倒数第个节点,在返回头结点。只需要找到倒数第个节点,将其删除,再返回。 ?作者简...
摘要:示例输入输出示例输入输出示例输入输出提示两个链表的节点数目范围是和均按非递减顺序排列递归法分析递归法,和之前的一样,还是需要先设置跳出判断,这里设置为空的时候跳出。 ...
摘要:关于递归这里提一两点递归基本有这几步递归的模板,终止条件,递归调用,逻辑处理。 ?作者简介:大家好,我是车神哥,府学路18号的车神? ?个人主页:应无所住而生...
摘要:有效二叉搜索树定义如下节点的左子树只包含小于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。而我们二叉搜索树保证了左子树的节点的值均小于根节点的值,根节点的值均小于右子树的值,因此中序遍历以后得到的序列一定是升序序列。 ...
阅读 361·2024-11-06 13:38
阅读 735·2024-09-10 13:19
阅读 865·2024-08-22 19:45
阅读 1362·2021-11-19 09:40
阅读 2595·2021-11-18 13:14
阅读 4265·2021-10-09 10:02
阅读 2282·2021-08-21 14:12
阅读 1267·2019-08-30 15:54