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

234. Palindrome Linked List

目录

一、题目描述

方法一、使用栈

方法二、将链表全部结点值复制到数组,再用双指针法

方法三、递归法逆序遍历链表

方法四、快慢指针+反转链表


一、题目描述

234. Palindrome Linked List

方法一、使用栈

需要遍历两次。时间复杂度O(n),空间复杂度O(n)。

/*** 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) {stack<int> S;ListNode* cur = head;while(cur){S.push(cur->val);cur = cur->next;}cur = head;while(cur){if(cur->val != S.top()){return false;}cur = cur->next;S.pop();}return true;}
};

方法二、将链表全部结点值复制到数组,再用双指针法

也是需要遍历两次,时间复杂度O(n)。空间复杂度O(n)。

/*** 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) {vector<int> nums;nums.reserve(100000);ListNode* cur = head;while(cur){nums.push_back(cur->val);cur = cur->next;}int left = 0;int right = nums.size()-1;while(left<right){if(nums[left]!=nums[right])return false;left++;right--;}return true;}
};

方法三、递归法逆序遍历链表

可以用递归法逆序遍历链表。用全局变量正序遍历链表。这样就实现了同时从两端遍历链表。

时间复杂度O(n)。递归栈的深度是n,所以空间复杂度还是O(n)。

/*** 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 {ListNode* forward = nullptr;//从链表头向链表尾正向遍历的指针
public:bool isPalindrome(ListNode* head) {forward = head;//题目已经保证head不为nullptr,至少有一个结点return recursiveCheck(head);}//用递归来逆序遍历链表bool recursiveCheck(ListNode* cur){if(cur->next){if(!recursiveCheck(cur->next))return false;}if(cur->val != forward->val)return false;forward = forward->next;return true;}
};

方法四、快慢指针+反转链表

将链表后半部分反转。然后同时遍历前半部分和后半部分,逐个比较。

第一步,用快慢指针法找到链表后半部分的开头结点。如果结点个数是奇数,则正中间的结点算作后半部分的开头也可以。参考leetcode 876. 链表的中间结点-CSDN博客

第二步,反转后半部分链表。参考leetcode 206. 反转链表-CSDN博客

第三步,同时遍历前半部分和后半部分,判断是否回文。

第四步,恢复原链表。

第五步,返回结果。

时间复杂度O(n)。空间复杂度O(1)。

/*** 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* slow = head;ListNode* fast = head;while(fast&&fast->next){fast = fast->next->next;slow = slow->next;}ListNode* middle = slow;//把链表后半部分反转ListNode* reveredRight = reverse(middle);ListNode* right = reveredRight;ListNode* left = head;bool res = true;while(left != middle){if(left->val != right->val){res = false;break;}left = left->next;right = right->next;}//恢复原链表reverse(reveredRight);return res;}ListNode* reverse(ListNode* head){ListNode* pre = nullptr;ListNode* cur = head;ListNode* nex = nullptr;while(cur){nex = cur->next;cur->next = pre;pre = cur;cur = nex;}return pre;}
};
http://www.lryc.cn/news/2392847.html

相关文章:

  • 广州邮科高频开关电源:以创新科技赋能通信能源绿色未来
  • day41 python图像识别任务
  • 无人机报警器探测模块技术解析!
  • Docker 替换宿主与容器的映射端口和文件路径
  • 我的3种AI写作节奏搭配模型,适合不同类型写作者
  • Bonjour
  • 华为云Flexus+DeepSeek征文 | 基于Dify和DeepSeek-R1开发企业级AI Agent全流程指南
  • HarmonyOS-ArkUI固定样式弹窗(1)
  • 痉挛性斜颈相关内容说明
  • C语言| 函数参数传递指针
  • 【25-cv-05917】HSP律所代理Le Petit Prince 小王子商标维权案
  • MyBatis 动态 SQL 详解:灵活构建强大查询
  • 从 “金屋藏娇” 到 自然语言处理(NLP)
  • vue3 ElMessage提示语换行渲染
  • Java 微服务架构设计:服务拆分与服务发现的策略
  • 华为OD机试真题——二叉树中序遍历(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
  • 解决 Go 中 `loadinternal: cannot find runtime/cgo` 错误
  • VSCode + GD32F407 构建烧录
  • Linux研学-入门命令
  • Hive在实际应用中,如何选择合适的JOIN优化策略?
  • 设计模式之结构型:桥接模式
  • 监控 Oracle Cloud 负载均衡器:使用 Applications Manager 释放最佳性能
  • 早发现=早安心!超导心磁图如何捕捉早期病变信号?
  • 使用Vditor将Markdown文档渲染成网页(Vite+JS+Vditor)
  • Python打卡DAY40
  • OPC Client第6讲(wxwidgets):Logger.h日志记录文件(单例模式);登录后的主界面
  • CesiumInstancedMesh 实例
  • 单细胞注释前沿:CASSIA——无参考、可解释、自动化细胞注释的大语言模型
  • 历年武汉大学计算机保研上机真题
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(30):みます