当前位置: 首页 > 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.lryc.cn/news/591312.html

相关文章:

  • Day04_C语言网络编程20250716_sql语言大全
  • Ollama使用指南-更改默认安装路径和Model路径(安装到非C盘)
  • 【计算机网络】第四章:网络层(上)
  • 【Linux-云原生-笔记】LVS(Linux virual server)相关
  • 云原生环境下的安全控制框架设计
  • MongoDB社区版安装(windows)
  • mongodb 入门级别操作
  • 如何清除 npm 缓存
  • Redis3:Redis数据结构与命令全解析
  • MongoDB 安装步骤详解
  • AI交互的初期魅力与后期维护挑战
  • RISC-V和ARM有何区别?
  • npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1
  • Flutter状态管理篇之ChangeNotifier(一)
  • 深度学习之神经网络(二)
  • Flutter基础(前端教程①②-序列帧动画)
  • Oracle数据泵详解——让数据迁移像“点外卖”一样简单​
  • 如何查询pg账号权限 能否创建模式 删表建表
  • xss防御策略
  • 从 0 到 1 玩转 XSS - haozi 靶场:环境搭建 + 全关卡漏洞解析
  • OpenCV中VideoCapture 设置和获取摄像头参数和Qt设计UI控制界面详解代码示例
  • 用Python实现神经网络(二)
  • 前端0知识docker临危之被迫弄docker教程
  • NumPy, SciPy 之间的区别
  • ota之.加密算法,mcu加密方式
  • 量化环节:Cont‘d
  • C++网络编程 6.I/0多路复用-epoll详解
  • 现在遇到一个问题 要使用jmeter进行压测 jmeter中存在jar包 我们还要使用linux进行发压,这个jar包怎么设计使用
  • cherry使用MCP协议Streamable HTTP实践
  • RSTP:快速收敛的生成树技术