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

很妙的一道题 Leetcode234. 回文链表


分类: 链表;栈
难度: 简单
情况: /*
备注: 反转链表模板;快慢指针
tags:

  • leetcode

链接:234. 回文链表

题面

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

代码

解法一:栈

这个解法可以看官方题解里的视频(就是那个类似ppt一样一步一步的图),更直观一些。

很妙!利用系统栈来储存cur

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode *front;bool check(ListNode *cur) {if (cur != nullptr) {if (check(cur->next) == false) {return false;}if (cur->val != front->val) {return false;}front = front->next;}return true;}bool isPalindrome(ListNode* head) {front = head;return check(head);}
};

解法二:快慢指针+反转链表

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:bool isPalindrome(ListNode* head) {ListNode *fast = head, *slow = head;while (fast->next && fast->next->next) {fast = fast->next->next;slow = slow->next;}// if (fast->next) fast = fast->next;// cout << fast->val << " " << slow->val << endl;ListNode* prev = nullptr;ListNode *cur = slow->next; // 下半段链表的开始节点while (cur) {ListNode *temp = cur->next;cur->next = prev;prev = cur;cur = temp;}// cout << prev->val << endl;// while (head != prev) {// prev才是反转后链表的入口while (prev) { // cout << prev->val << " " << head->val << endl;if (head->val != prev->val) return false;head = head->next;prev = prev->next;}return true;}
};

遇到的错误

反转链表模板:

ListNode* prev = nullptr;
ListNode* curr = slow->next; // 反转 slow 之后的部分
while (curr) {ListNode* nextTemp = curr->next;curr->next = prev;prev = curr;curr = nextTemp;
}
  • prev 就是反转后的链表头。
  • 反转链表是把后半段断开,变成一个独立的链表
  • 循环中prev和curr的赋值顺序不能变
  • 我最开始以为反转链表只是改变了指针方向,那 fast 应该还是指向最后一个节点,但是反转完后,fast 仍然指向原链表的尾节点(值为 1),但是它的 next 已经被你反转为了 nullptrfast 不再是反转链表的入口
    e.g.
  1 → 2 → 3 → 2 → 1 
反转后:1 → 2 → 3  1 ← 2↑prev

相关的题

leetcode206. 反转链表

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

相关文章:

  • windows部署ACE-Step记录
  • 从一起知名线上故障,谈配置灰度发布的重要性
  • 大模型的开发应用(十九):多模态模型基础
  • 源代码管理工具有哪些?有哪些管理场景?
  • React面试题
  • 2025年SDK游戏盾终极解析:重新定义手游安全的“隐形护甲”
  • 【Linux操作系统】简学深悟启示录:Linux环境基础开发工具使用
  • 浅谈面试中的递归算法
  • 进程通信————system V 消息队列 信号量
  • 卡内基梅隆大学提出Human2LocoMan:基于人类预训练的四足机器人「多功能操作学习框架」
  • sqlite3学习---基础知识、增删改查和排序和限制、打开执行关闭函数
  • AAAI 2025多模态重大突破:SENA框架重塑多模态学习,零标注实现自进化
  • 【Python】—— 语法糖
  • 求两数之和
  • R语言与作物模型(以DSSAT模型为例)融合应用高级实战技术
  • window显示驱动开发—Direct3D 11 视频设备驱动程序接口 (DDI)
  • 图片上传 el+node后端+数据库
  • 数据库事务中的陷阱:脏读、幻读与不可重复读
  • 第四章:分析 Redis 性能高原因和核心字符串类型命令
  • 特性阻抗的近似计算
  • 【Linux】协议——TCP/IP协议
  • PTX指令集基础以及warp级矩阵乘累加指令介绍
  • 5G MBS(组播广播服务)深度解析:从标准架构到商用实践
  • 机器学习(重学版)基础篇(算法与模型一)
  • Ansible提权sudo后执行报错
  • 大语言模型(LLM):重塑AI未来的技术革命
  • 11-大语言模型—Transformer 盖楼,BERT 装修,RoBERTa 直接 “拎包入住”|预训练白话指南
  • 【笔记】Handy Multi-Agent Tutorial 第四章 CAMEL框架下的RAG应用(实践)
  • 四、计算机组成原理——第5章:存储系统
  • C++20实战FlamingoIM开发