<LeetCode天梯>Day028 回文链表(双指针+递归+栈+数组) | 初级算法 | Python

简介: <LeetCode天梯>Day028 回文链表(双指针+递归+栈+数组) | 初级算法 | Python

以下为我的天梯积分规则:


每日至少一题:一题积分+10分

若多做了一题(或多一种方法解答),则当日积分+20分(+10+10)

若做了三道以上,则从第三题开始算+20分(如:做了三道题则积分-10+10+20=40;做了四道题则积分–10+10+20+20=60)


初始分为100分

若差一天没做题,则扣积分-10分(周六、周日除外注:休息)

坚持!!!


初级算法

刷题目录

链表


image.pngimage.png

image.png

题干

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。

示例1:

image.png

:head = [1,2,2,1]

输出:true

示例2:

image.png

输入:head = [1,2]

输出:false


提示:


链表中节点数目在范围[1, 105] 内

0 <= Node.val <= 9

双指针(反转后半部分链表)

分析:


首先要明白一点回文链表是什么,回文链表就是以链表中间为中心点两边对称。

平时比较常见的是字符串回文串,我们使用双指针,一直指向首,另一个指向尾部,这样往中间一直走一直比对,全部相同则返回True,不同则False。

由于本题判断的是链表,且是单向链表,只能从前往后访问,不能从后往前访问,所以使用判断字符串的那种方式是行不通的。

但是我们可以通过首先寻找到中间的节点,然后再将后半部分节点进行反转操作,再将两半部分链表进行比对就OK了。


具体的借用下大佬的图:

image.png

image.png

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

真的,真的,真的好慢呀!~

image.png

递归法

再试试递归法~

可以对链表逆序操作:

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()

说实话,这个递归更慢,下面再试一下栈!递归有点难以理解,建议慢慢思考!~

image.png

利用先进后出的思想,将其放在栈中,然后再一个一个出站,就实现了链表从后往前访问了。


其中还可以用一个简单的,将链表的值放在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

利用栈操作,比递归快很多,哈哈哈!

image.png

链表转数组比对

接着上面的,我们可以将链表值直接存入新的数组中,然后再对数组反转,将二者进行比对,如果相同则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]

速度又提升了耶!~

image.png



相关文章
|
2月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
46 0
|
20小时前
|
算法 容器
【算法】——双指针算法合集(力扣)
移动零,复写零,快乐数,盛最多水的容器,有效三角形的个数,和为s的两个数(查找总价格为目标值的两个商品 ),三数之和,四数之和
|
1月前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
2月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
48 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
2月前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
35 2
|
2月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
27 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
1天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
103 80
|
20天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
|
6天前
|
供应链 算法 调度
排队算法的matlab仿真,带GUI界面
该程序使用MATLAB 2022A版本实现排队算法的仿真,并带有GUI界面。程序支持单队列单服务台、单队列多服务台和多队列多服务台三种排队方式。核心函数`func_mms2`通过模拟到达时间和服务时间,计算阻塞率和利用率。排队论研究系统中顾客和服务台的交互行为,广泛应用于通信网络、生产调度和服务行业等领域,旨在优化系统性能,减少等待时间,提高资源利用率。