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

牛客:链表的回文结构详解

链表的回文结构_牛客题霸_牛客网

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};*/
#include <cstddef>// 反转链表函数:将链表反转并返回新的头节点
struct ListNode* reverseList(struct ListNode* head){struct ListNode *newhead = NULL;  // 新链表的头节点(初始为空)struct ListNode *cur = head;      // 当前处理的节点// 遍历原链表,逐个节点反转while(cur) {struct ListNode *next = cur->next;  // 保存下一个节点的指针// 将当前节点连接到新链表的头部cur->next = newhead;newhead = cur;  // 更新新链表的头节点为当前节点cur = next;  // 处理下一个节点}return newhead;  // 返回后的链表头节点
}class PalindromeList {
public:bool chkPalindrome(ListNode* A) {// 思路:通过快慢指针针找到链表中点,反转后半部分,再与前半部分比较// 特殊情况处理:空链表或单节点链表都是回文if(A == NULL || A->next == NULL) return true;ListNode *fast = A;  // 快指针(一次走两步)ListNode *slow = A;  // 慢指针(一次走一步)ListNode *prev = NULL;  // 用于记录慢指针的前一个节点// 1. 找到链表的中点// 当快指针到达尾部时,慢指针刚好在中点位置while(fast && fast->next) {prev = slow;          // 保存慢指针当前位置slow = slow->next;    // 慢指针前进一步fast = fast->next->next;  // 快指针前进两步}// 2. 将前半部分链表的尾部断开(与后半部分分离)prev->next = NULL;// 3. 反转后半部分链表slow = reverseList(slow);// 4. 比较前半部分和反转后的后半部分while(A) {  // 前半部分遍历完即结束// 若对应节点值不相等,则不是回文if(A->val != slow->val)return false;else {A = A->next;    // 前半部分后移slow = slow->next;  // 后半部分后移}}// 所有对应节点值都相等,是回文return true;}
};/* 样例讲解:
假设链表为:1 -> 2 -> 3 -> 2 -> 1(是回文)步骤1:找中点
- 初始:fast=1, slow=1, prev=NULL
- 第一次循环:prev=1, slow=2, fast=3
- 第二次循环:prev=2, slow=3, fast=1(fast->next为NULL,退出循环)
此时slow指向中点3,prev指向2步骤2:断开前半部分
prev->next=NULL → 前半部分变为:1->2步骤3:反转后半部分
原后半部分:3->2->1 → 反转后:1->2->3步骤4:比较两部分
- A=1, slow=1 → 相等
- A=2, slow=2 → 相等
- A=NULL(前半部分结束)→ 循环退出返回true,判断为回文另一个样例:1->2->3->4(不是回文)
步骤1:找中点后,前半部分1->2,后半部分3->4
步骤2:反转后半部分为4->3
步骤3:比较1 vs 4 → 不相等,返回false
*/

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

相关文章:

  • NewsNow搭建喂饭级教程
  • SQL中对视图的操作命令汇总
  • STM32H750 CoreMark跑分测试
  • [最新]Dify v1.7.2版本更新:工作流可视化和节点搜索
  • 2025 年 8 月《GPT-5 家族 SQL 能力评测报告》发布
  • SQL视图、存储过程和触发器
  • OBCP第四章 OceanBase SQL 调优学习笔记:通俗解读与实践指南
  • CentOS 7安装FFmpeg
  • QT QProcess, WinExec, ShellExecute中文路径带空格程序或者脚本执行并带参数
  • Qt实现TabWidget通过addTab函数添加的页,页内控件自适应窗口大小
  • Qt文件压缩工具项目开发教程
  • 【Bug】CentOS 7 使用vim命令报错vim: command not found
  • 开源 C++ QT Widget 开发(四)文件--二进制文件查看编辑
  • Elasticsearch官方文档学习-未完待续
  • java项目:如何优化JVM参数?
  • 【深入理解 Linux 网络】收包原理与内核实现(下) 从 TCP 传输层到应用
  • 遥感机器学习入门实战教程|Sklearn案例⑤:集成学习方法全览
  • ES_flattened
  • Nacos部署微服务
  • Python机器学习入门:用scikit-learn构建你的第一个预测模型
  • 安装nvtop编译报错:fatal error: linux/kcmp.h: No such file or directory
  • 亚远景科技助力力邦合信通过ASPICE CL2评估
  • 今日科技焦点 | A股科技芯片受追捧,美股科技股承压——技术赛道的资本与市场博弈
  • 云计算下数据隐私保护系统的设计与实现(LW+源码+讲解+部署)
  • 2025高性能氢气传感器领域的创新引领者:杭州德克西智能科技有限公司
  • 云计算学习笔记——用户和组的管理、周期性任务篇
  • ECCV 2020 | 动态图像在3D MRI图像阿尔茨海默病分类中的应用
  • Wireshark USRP联合波形捕获
  • 软件测试体系建设要怎么做
  • 手写MyBatis第28弹:告别代理,直击本质:手写MyBatis SqlSession的增删改查奥秘