IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LeetCode 234. 回文链表 -> 正文阅读

[数据结构与算法]LeetCode 234. 回文链表

1、题目

请判断一个链表是否为回文链表。

示例 1:

输入: 1->2
输出: false

2、解答

这道题其实要想清楚如何判断是否回文。有两种思路,一种就是从首尾两端一一对比;一种是找到中间位置,然后比较前后两部分。

  • 前后指针法:就是把链表转换成数组,然后比较数组是否回文。
  • 栈空间法:这个也是思路一的实现,只不过借用了栈。
  • 递归法:这个算比较巧妙吧,递归找到链表结尾,然后根据递归的特性,反过来遍历这个链表。
  • 快慢指针法:前面三个是思路一的实现,这种事思路二的实现。维护快慢两个指针,然后找到中间位置,再翻转后半指针,和前半部分比较。这种思路空间复杂度是O(1)。
class Solution(object):
    def isPalindrome(self, head):
        """
        双指针法:就是从这个链表首尾两端开始遍历,依次比较左右两个指针值是否相等即可
        :type head: ListNode
        :rtype: bool
        """
        if head is None or head.next is None:
            return True

        node_values = []
        while head is not None:
            node_values.append(head.val)
            head = head.next
        left = 0
        right = len(node_values) - 1
        while left <= right:
            if node_values[left] != node_values[right]:
                return False
            left += 1
            right -= 1
        return True

    def isPalindrome2(self, head):
        """
        栈:这个和双指针其实类似,就是借助了栈这个数据结构
        :type head: ListNode
        :rtype: bool
        """
        if head is None or head.next is None:
            return True
        node_stack = []
        temp = head
        while temp is not None:
            node_stack.append(temp.val)
            temp = temp.next
        while len(node_stack)>0:
            if node_stack.pop(0)!=head.val:
                return False
            head = head.next
        return True


    def isPalindrome3(self, head):
        """
        递归法:这个方法其实也是先递归到链表最底部再和首部比较
        :type head: ListNode
        :rtype: bool
        """
        if head is None or head.next is None:
            return True
        self.gobal = head

        return self.back_trace(head.next)


    def back_trace(self, head):
        if head is None:
            return True

        if self.back_trace(head.next):
            if self.gobal.val==head.val:
                self.gobal = self.gobal.next
                return True
        return False

    def isPalindrome4(self, head):
        """
        快慢指针法:这个是先找到中间点再比较
        :type head: ListNode
        :rtype: bool
        """
        if head is None or head.next is None:
            return True

        fast = low = head
        while fast.next is not None and fast.next.next is not None:
            fast = fast.next.next
            low = low.next
        # 这步操作是用来移动到整个链表的后面部分再翻转
        low = low.next
        reversal_next = self.reversal_node(low)
        while reversal_next is not None:
            if reversal_next.val!=head.val:
                return False
            reversal_next = reversal_next.next
            head = head.next
        return True

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-13 12:32:05  更:2021-08-13 12:34:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:48:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码