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

相关文章:

  • 牛客:链表分割算法详解
  • LeetCode100 -- Day3
  • C++---滑动窗口平滑数据
  • 深度学习之NLP基础
  • KB5063878补丁故障解决方案:从蓝屏幕到系统修复的全面指南
  • 短波红外科研相机:开启科研新视野的利器​
  • 【矩池云】实现Pycharm远程连接,上传数据并解压缩
  • C++入门自学Day16-- STL容器类型总结
  • 全文 part1 - DGEMM Using Tensor Cores, and Its Accurate and Reproducible Versions
  • 阿里云对象存储OSS之间进行数据转移教程
  • 打工人项目日报计划
  • 数据安全管理——解读银行保险机构数据安全管理办法【附全文阅读】
  • Elasticsearch Ruby 客户端elasticsearch / elasticsearch-api
  • DBLens 业界首创AI表结构变更审查,智能评估影响,助力开发效率跃升。
  • 数据库原理及应用_数据库基础_第2章关系数据库标准语言SQL_数据查询(2)分组查询
  • 第三方软件测试报告的行业价值
  • 两台电脑之间如何传输大文件?
  • C++设计模式--策略模式与观察者模式
  • 安卓app、微信小程序等访问多个api时等待提示调用与关闭问题
  • QT QProcess, WinExec, ShellExecute中文路径带空格程序或者脚本执行并带参数
  • 灵活使用UE5 Modeling中的UV编辑功能
  • QT-初识
  • 日志收集(ELK)
  • javaweb开发笔记——微头条项目开发
  • 【笔记】Facefusion3.3.2 之 NSFW 检测屏蔽测试
  • Windows 系统中,添加打印机主要有以下几种方式
  • macos使用FFmpeg与SDL解码并播放H.265视频
  • Git常用操作大全(附git操作命令)
  • 【LeetCode】18. 四数之和
  • 微服务的编程测评系统13-我的竞赛列表-elasticSearch