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

LeetCode 234:回文链表

题目描述

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

示例 1:

输入:head = [1,2,2,1]
输出:true

示例 2:

输入:head = [1,2]
输出:false

解题思路

1.栈+双指针

大致思路:使用双指针定位中心元素并将链表前半部分入栈,挨个出栈并遍历后半部分做比较,如果不想等则为false;

class Solution {public boolean isPalindrome(ListNode head) {if (head == null || head.next == null) {return true;}// 使用快慢指针找到链表中点ListNode slow = head;ListNode fast = head;LinkedListStack<Integer> stack = new LinkedListStack<>();// 将前半部分入栈while (fast != null && fast.next != null) {stack.push(slow.val);slow = slow.next;fast = fast.next.next;}// 如果链表长度是奇数,跳过中间节点if (fast != null) {slow = slow.next;}// 比较后半部分和栈中元素while (slow != null) {if (stack.pop() != slow.val) {return false;}slow = slow.next;}return true;}
}public class LinkedListStack<T> {// 定义链表节点private static class Node<T> {T data;Node<T> next;Node(T data) {this.data = data;this.next = null;}}private Node<T> top; // 栈顶节点private int size;    // 栈的大小public LinkedListStack() {top = null;size = 0;}// 入栈操作public void push(T item) {Node<T> newNode = new Node<>(item);newNode.next = top; // 新节点的next指向原来的栈顶top = newNode;     // 更新栈顶为新节点size++;}// 出栈操作public T pop() {if (isEmpty()) {throw new IllegalStateException("Stack is empty");}T item = top.data;  // 获取栈顶数据top = top.next;     // 栈顶指向下一个节点size--;return item;}// 判断栈是否为空public boolean isEmpty() {return top == null;}
}

 2.反转链表+双指针

class Solution {public boolean isPalindrome(ListNode head) {if (head == null || head.next == null) return true;// 1. 快慢指针找中点ListNode slow = head, fast = head;while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;}// 2. 反转后半部分ListNode reversedSecondHalf = reverse(slow);// 3. 比较前后两部分ListNode p1 = head, p2 = reversedSecondHalf;boolean isPalindrome = true;while (p2 != null) {if (p1.val != p2.val) {isPalindrome = false;break;}p1 = p1.next;p2 = p2.next;}return isPalindrome;}private ListNode reverse(ListNode head) {//prev指向反转后链表的最后一个 初始为null  curr指向要反转的那个节点,从head开始ListNode prev = null, curr = head;while (curr != null) {//将反转的下一个节点先记录下来ListNode next = curr.next;//使用头插法curr.next = prev;//将当前反转的节点设置为反转后节点的最后一个prev = curr;//反转下一个节点curr = next;}return prev;}
}

http://www.dtcms.com/a/285162.html

相关文章:

  • 文件类型说明
  • H7-TOOL脱机下载后,自动重连RTT,CAN和串口助手三合一模式方法,方便项目测试(2025-07-16)
  • Spring Boot 分层架构详解:Controller、Service、Mapper...
  • C++网络编程 5.TCP套接字(socket)通信进阶-基于多线程的TCP多客户端通信
  • 鸿蒙状态栏操作
  • 能碳管理平台:企业碳减排解决方案绿色工厂达标工具
  • Trae IDE:打造完美Java开发环境的实战指南
  • 基于深度学习的电信号分类识别与混淆矩阵分析
  • AI 总结工作报告
  • 【人工智能agent】--dify版本更新(通用)
  • 错误经验一:计算两个整数a和b的和
  • Paimon 动态分桶
  • 如何优雅处理 Flowable 工作流的 TaskAlreadyClaimedException?
  • SpringBoot02-application配置文件
  • 行业研究 | 2025金融可观测性实践与趋势洞察报告重磅发布!
  • 数据结构自学Day9: 二叉树的遍历
  • 克鲁斯焊接机器人保护气省气方案
  • JS - - - - - 数组乱序排序「进阶版」
  • c++:类型转换函数
  • mongodb-org-mongos : Depends: libssl1.1 (>= 1.1.1) but it is not installable
  • 基于LSTM的机场天气分析及模型预测
  • .NET Core EFCore零基础快速入门简单使用
  • 微信远程控制系统2.0
  • 二叉树的总结
  • mysql 字符集不一致导致索引失效问题
  • 为何“白名单媒体”是性价比之选?
  • 2025年视频超高清技术应用全景介绍
  • CSS Grid布局:构建现代网页的强大网格系统
  • Doris 物化视图:原理、使用及常见问题处理
  • Python类型转换,深浅拷贝