回文链表(递归方法)

首先关于链表,有两种常用的实现,分别是数组列表和链表,若想在链表中存储值是如何做到的呢?

  • 数组列表底层是使用数组存储值,我们可以通过索引在 O(1)O(1)O(1) 的时间访问列表任何位置的值,这是由基于内存寻址的方式。
  • 链表存储的是称为节点的对象,每个节点保存一个值和指向下一个节点的指针。访问某个特定索引的节点需要 O(n)O(n)O(n) 的时间,因为要通过指针获取到下一个位置的节点。

题目描述

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

思路

如果使用递归反向迭代节点,同时使用递归函数外的变量向前迭代,就可以判断链表是否为回文。

算法 currentNode 指针是先到尾节点,由于递归的特性再从后往前进行比较。frontPointer 是递归函数外的指针。若 currentNode.val != frontPointer.val 则返回 false。反之,frontPointer 向前移动并返回 true。

代码

java 复制代码
class Solution {
    private ListNode frontPointer;

    private boolean recursivelyCheck(ListNode currentNode) {
        if (currentNode != null) {
            if (!recursivelyCheck(currentNode.next)) {
                return false;
            }
            if (currentNode.val != frontPointer.val) {
                return false;
            }
            frontPointer = frontPointer.next;
        }
        return true;
    }

    public boolean isPalindrome(ListNode head) {
        frontPointer = head;
        return recursivelyCheck(head);
    }
}
相关推荐
Tisfy2 分钟前
LeetCode 1351.统计有序矩阵中的负数:O(m+n)时间复杂度——抽象题解
算法·leetcode·矩阵·题解·遍历
doukaiyu5 分钟前
P3613 【深基15.例2】寄包柜
算法
CoderCodingNo15 分钟前
【GESP】C++五级真题(数论-素数思想考点) luogu-P10720 [GESP202406 五级] 小杨的幸运数字
开发语言·c++·算法
小李小李快乐不已17 分钟前
算法技巧理论基础
数据结构·c++·算法·leetcode·hot100
少许极端22 分钟前
算法奇妙屋(二十一)-两个数组或字符串的dp问题(动态规划)
算法·动态规划·两个数组或字符串的dp问题
草莓熊Lotso22 分钟前
《算法闯关指南:递归,搜索与回溯算法--递归》--04. 两两交换链表中的结点 ,05.Pow(x,n)
数据结构·算法·链表
Bruce_kaizy25 分钟前
c++图论——最短路之Johnson算法
开发语言·数据结构·c++·算法·图论
蒙奇D索大35 分钟前
【数据结构】排序算法精讲 | 交换排序全解:交换思想、效率对比与实战代码剖析
数据结构·笔记·考研·算法·排序算法·改行学it
sin_hielo37 分钟前
leetcode 1351
数据结构·算法·leetcode
睡醒了叭38 分钟前
图像分割-传统算法-边缘分割
图像处理·opencv·算法·计算机视觉