当前位置: 首页 > article >正文

leetcode234回文链表

递归思路

因为是单链表,没法往回找,可以用递归
递归在函数调用的时候会返回,走到最后一个我们让他和第一个比较。
往右走可以通过next,往左通过递归的特性

代码

代码一,我自己的

package leetcode;

import java.util.List;

public class Q234 {
    ListNode first = null;  //需要这个

    public boolean isPalindrome(ListNode head) {
        first = head;
        return recursion(head);
    }
    public boolean recursion(ListNode node){
        if (node == null){
            return true;
        }
        if (recursion(node.next)){
            if (node.val == first.val){
                first = first.next;
                return true;
            }else {
                return false;
            }
        }else { //其实只要一个比失败,就会一直返回这个
            return false;
        }
    }
}

题解的:

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);
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/palindrome-linked-list/solutions/457059/hui-wen-lian-biao-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

但是递归需要走完序列

比如我们 1 2 3 2 1,只需要两边走到3就可以,但现在必须1 2 3 2 1都走完
因为递归必须一层一层调完

第二种思路

找到中点,然后就后半部分反转(头插法),再比较两个部分

怎么找链表的中点,快慢指针,快的一次走两步,是慢的二倍,所以快的到头以后慢的就到中点了,但是要区分
1 2 3 2 1 和 1 2 2 1两种情况的中点

快慢指针还可以判断环

package leetcode;

import java.util.List;

public class Q234 {
    public boolean isPalindrome(ListNode head) {
        if (head == null) { // 没有数
            return false;
        }
        if (head.next == null) { //只有一个数
            return true;
        }
        if (head.next.next == null) { //只有两个数
            if (head.val == head.next.val) {
                return true;
            } else {
                return false;
            }
        }
        ListNode mid = findMid(head);
        ListNode head2 = mid;
        ListNode p = mid.next;
        head2.next = null;
        while (p != null) {
            ListNode cnt = p;
            p = p.next;
            cnt.next = head2;
            head2 = cnt;
        }
        while (head != null && head2 != null) {
            if (head.val != head2.val) {
                return false;
            }
            head = head.next;
            head2 = head2.next;
        }
        return true;
    }

    public ListNode findMid(ListNode head) {
        ListNode fast = head;
        ListNode low = head;
        do {
            low = low.next;
            fast = fast.next;
            fast = fast.next;
            if (fast == null) {
                return low;
            }
            if (fast.next == null) {
                return low.next;
            }
        } while (fast != low);
        return null;
    }


}


http://www.kler.cn/a/316143.html

相关文章:

  • 从华为到创业公司
  • 【Mode Management】AUTOSAR架构下唤醒源检测函数EcuM_CheckWakeup详解
  • 【go从零单排】Random Numbers、Number Parsing
  • uni-app中使用 unicloud 云开发平台③
  • 深入剖析【C++继承】:单一继承与多重继承的策略与实践,解锁代码复用和多态的编程精髓,迈向高级C++编程之旅
  • 字节跳动核心技术:TT推荐系统从0-1落地应用
  • 初学者的鸿蒙多线程并发之 TaskPool 踩坑之旅
  • 我向大模型求了一份Stable Diffusion的应用场景
  • 科研绘图系列:R语言多个AUC曲线图(multiple AUC curves)
  • 清理Go/Rust编译时产生的缓存
  • 1.《DevOps》系列K8S部署CICD流水线之部署K8S集群~version1.28.2
  • 36.右旋字符串
  • Llama3.1的部署与使用
  • 【齐家网-注册/登录安全分析报告】
  • 微信小程序案例:比较数字大小(含代码)
  • 鸿蒙4.0(HarmonyOS 4.0)与鸿蒙Next(HarmonyOS Next)区别
  • 苹果macOS 15.0 Sequoia正式版发布:iPhone应用镜像玩、手机消息电脑知
  • 医院信息化运维监控:确保医疗系统的稳定与安全
  • 【C#生态园】从消息处理到可靠传输:探索.NET开发中不可或缺的六大库
  • 计算机毕设设计推荐-基于python+Djanog大数据的电影数据可视化分析
  • CentOS上使用rpm离线安装Mosquitto(Linux上Mqtt协议调试工具)附资源下载
  • k8s下的网络通信与调度
  • 苹果CMS插件:优化蜘蛛访问内容,提升百度收录率
  • 供方软件供应链安全保障要求及开源场景对照自评表(下)
  • 【JVM】类加载
  • 玩转RabbitMQ声明队列交换机、消息转换器