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

相关文章:

  • 力扣 之 最小覆盖子串(变长滑动窗口,越短越好)
  • 电磁兼容五:仿真技术
  • Mac安装navicat17版本教程mac下载Navicat Premium for Mac v17.1.9【好用】
  • 微算法科技(NASDAQ:MLGO)利用基于区块链的机器学习模型进行交易分类,实现交易数据的匿名化
  • redis数据库的四种取得 shell方法
  • 安宝特案例丨户外通信机房施工革新:AR+作业流技术破解行业难题
  • 免费版酒店收银系统弹窗在押金原路退回流程中的应用价值探究 ——仙盟创梦IDE
  • 设计模式(二十一)行为型:状态模式详解
  • python生成 requirement.txt 文件
  • fchown/fchownat系统调用及示例
  • 技术总结|如何使用提升 strlen 的性能?
  • lesson26-2:使用Tkinter打造简易画图软件优化版
  • 数据链路层 和 ARP协议
  • MQTT的原理
  • 华为Huawei 6730交换机查看接口收发光命令 transceiver
  • 9.c语言常用算法
  • Anaconda创建环境报错:CondaHTTPEFTOT: HTTP 403 FORBIDDEN for url
  • Linux中配置haproxy
  • gitlab 在线合并分支a-分支b,解决冲突后,反向合并分支b-分支a
  • 数据结构——图(二、图的存储和基本操作)
  • 人机交互打字游戏
  • Leetcode——11. 盛最多水的容器
  • 力扣-39.组合总和
  • PhpStorm + PHP8.1 + XDebug3 实现断点调试(亲测可用)
  • 面试问题收集——卷积神经网络
  • 从 “看天吃饭” 到 “精准可控”:边缘计算网关如何引爆智慧农业种植变革?
  • 计算机毕设分享-基于SpringBoot的健身房管理系统(开题报告+前后端源码+Lun文+开发文档+数据库设计文档)
  • 服务器多线主要是指什么?
  • 服务器查日志太慢,试试grep组合拳
  • 数据中心入门学习(四):服务器概述与PCIe总线