本文 https://github.com/youngyangyang04/leetcode-master 已经收录,里面还有leetcode刷题攻略、各个类型经典题目刷题顺序、思维导图,可以fork到自己仓库,有空看一看一定会有所收获,如果对你有帮助也给一个star支持一下吧!

题目链接

https://leetcode-cn.com/problems/palindrome-linked-list/

思路

数组模拟

最直接的想法,就是把链表装成数组,然后再判断是否回文。

代码也比较简单。如下:

class Solution {
public:bool isPalindrome(ListNode* head) {vector<int> vec;ListNode* cur  = head;while (cur) {vec.push_back(cur->val);cur = cur->next;}// 比较数组回文for (int i = 0, j = vec.size() - 1; i < j; i++, j--) {if (vec[i] != vec[j]) return false;}return true;}
};

上面代码可以在优化,就是先求出链表长度,然后给定vector的初始长度,这样避免vector每次添加节点重新开辟空间

class Solution {
public:bool isPalindrome(ListNode* head) {ListNode* cur  = head;int length = 0;while (cur) {length++;cur = cur->next;}vector<int> vec(length, 0); // 给定vector的初始长度,这样避免vector每次添加节点重新开辟空间cur = head;int index = 0;while (cur) {vec[index++] = cur->val;cur = cur->next;}// 比较数组回文for (int i = 0, j = vec.size() - 1; i < j; i++, j--) {if (vec[i] != vec[j]) return false;}return true;}
};

反转后半部分链表

分为如下几步:

  • 用快慢指针,快指针有两步,慢指针走一步,快指针遇到终止位置时,慢指针就在链表中间位置
  • 同时用pre记录慢指针指向节点的前一个节点,用来分割链表
  • 将链表分为前后均等两部分,如果链表长度是奇数,那么后半部分多一个节点
  • 将后半部分反转 ,得cur2,前半部分为cur1
  • 按照cur1的长度,一次比较cur1和cur2的节点数值

如图所示:

代码如下:

class Solution {
public:bool isPalindrome(ListNode* head) {if (head == nullptr || head->next == nullptr) return true;ListNode* slow = head; // 慢指针,找到链表中间分位置,作为分割ListNode* fast = head;ListNode* pre = head; // 记录慢指针的前一个节点,用来分割链表while (fast && fast->next) {pre = slow;slow = slow->next;fast = fast->next->next;}pre->next = nullptr; // 分割列表ListNode* cur1 = head;  // 前半部分ListNode* cur2 = reverseList(slow); // 反转后半部分,总链表长度如果是奇数,cur2比cur1多一个节点// 开始两个链表的比较while (cur1) {if (cur1->val != cur2->val) return false;cur1 = cur1->next;cur2 = cur2->next;}return true;}// 反转链表ListNode* reverseList(ListNode* head) {ListNode* temp; // 保存cur的下一个节点ListNode* cur = head;ListNode* pre = nullptr;while(cur) {temp = cur->next;  // 保存一下 cur的下一个节点,因为接下来要改变cur->nextcur->next = pre; // 翻转操作// 更新pre 和 cur指针pre = cur;cur = temp;}return pre;}
};

我是程序员Carl,利用工作之余重刷leetcode,更多精彩算法文章尽在:代码随想录,关注后,回复「Java」「C++」「python」「简历模板」等等,有我整理多年的学习资料,可以加我微信,备注「简单自我介绍」+「组队刷题」,拉你进入刷题群(无任何广告,纯个人分享),每天一道经典题目分析,我选的每一道题目都不是孤立的,而是由浅入深一脉相承的,如果跟住节奏每篇连续着看,定会融会贯通。

以下资料希望对你有帮助:

  • 学习资料以及我的开源项目
  • 我的B站视频:算法和编程语言的讲解
  • leetcode刷题攻略
  • 程序员应该如何写简历(附简历模板)
  • 一线互联网公司技术面试的流程以及注意事项
  • C++面试&C++学习指南知识点整理

如果感觉题解对你有帮助,不要吝啬给一个

「leetcode」234. 回文链表:【数组模拟】【翻转后半部分】详解相关推荐

  1. leetcode系列--234.回文链表

    leetcode系列–第234题.回文链表 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表.如果是,返回 true :否则,返回 false . 输入:head = [1,2,2,1 ...

  2. 【LeetCode】【HOT】234. 回文链表(存入数组)

    [LeetCode][HOT]234. 回文链表 文章目录 [LeetCode][HOT]234. 回文链表 package hot;import java.util.ArrayList; impor ...

  3. LeedCode篇:234. 回文链表

    234. 回文链表 题目: 解题思路: 源码: 踩坑点: 题目: 解题思路: 1.先用快慢指针找到中间节点 2.后半个链表逆置 3.然后一一比较 源码: bool isPalindrome(struc ...

  4. [234] 回文链表

    [234] 回文链表 //请判断一个链表是否为回文链表. // // 示例 1: // // 输入: 1->2 //输出: false // // 示例 2: // // 输入: 1->2 ...

  5. LeetCode 234. 回文链表(快慢指针+链表反转)

    1. 题目 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false示例 2: 输入: 1->2->2->1 输出: true进阶: 你能否用 O(n) ...

  6. 34. Leetcode 234. 回文链表 (链表-双指针)

    给你一个单链表的头节点 head ,请你判断该链表是否为回文链表.如果是,返回 true :否则,返回 false .示例 1:输入:head = [1,2,2,1] 输出:true 示例 2:输入: ...

  7. Leetcode 234 回文链表 (每日一题 20210730)

    请判断一个链表是否为回文链表.示例 1:输入: 1->2 输出: false 示例 2:输入: 1->2->2->1 输出: true题目地址:https://leetcode ...

  8. leetcode 234. 回文链表(快慢指针+链表倒置)

    请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 代码 /*** Definitio ...

  9. leetcode - 234. 回文链表

    请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复杂 ...

  10. Leetcode 234. 回文链表 解题思路及C++实现

    解题思路: 先用快慢指针找到链表的中间节点,然后将链表一分为二: 然后将后半部分链表进行翻转,用到三个指针: 接着分别遍历两个链表,逐个比较 val 值,如果出现不相等,就返回 false. /*** ...

最新文章

  1. 技术不错的程序员,为何面试却“屡战屡败”
  2. Java设计模式-七大设计原则
  3. goroutine 那些事
  4. mysql分组取出每组地一条数据_MySQL 分组后取每组前N条数据
  5. android单片机蓝牙小车,手把手教你做蓝牙小车
  6. tolua++ 手册翻译地址
  7. ciclop读音,购机必备,15种 3D扫描 设备 优缺点汇总
  8. Wannafly 挑战赛27 题解
  9. UIView动画---移动与变形
  10. 26.go test
  11. 多用户访问SSAS cube权限设置
  12. Abaqus 2022安装教程
  13. Ubuntu easypr的配置
  14. EC11编码器原理以及驱动程序
  15. 蔚蓝(Celeste)Mod下载、安装指南
  16. 开启愉快的路由之旅:广工校园网Wifi
  17. Linux 块设备 EMMC 驱动介绍
  18. Python性能测试工具Locust入门
  19. 0型系统, I型系统, II型系统对PID的影响
  20. Canal与DataX等工具的区别

热门文章

  1. redis异常处理篇(持续更新中...)
  2. HDU 1024 (不重叠m段最大和) Max Sum Plus Plus
  3. python中快速删除实例对象中的所有属性
  4. 【心路历程】(NOIP 206)(HNOI 358)
  5. 第三章 SQL知识点总结
  6. input el-input 打印是取不到值 print()
  7. 【BZOJ4149】[AMPPZ2014]Global Warming 单调栈+RMQ+二分
  8. 在windows下用vagrant建立lnmp开发环境
  9. mac下nginx搭建
  10. MacOSX 下.app支持同时运行多个实例