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

牛客:链表内指定区间反转

链接:链表内指定区间反转_牛客题霸_牛客网

题解:

本题先将要反转的链表区间取出来,反转之后再添加到原链表中。为了防止链表的第一个节点被反转从而找不到头节点,要给原链表加上一个额外头节点。

/*** struct ListNode {*	int val;*	struct ListNode *next;*	ListNode(int x) : val(x), next(nullptr) {}* };*/
class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param head ListNode类 * @param m int整型 * @param n int整型 * @return ListNode类*/ListNode* reverseBetween(ListNode* head, int m, int n) {// write code here//为原链表增加头节点(防止第一个节点被反转,导致无法返回)ListNode* pHead=new ListNode(-1);pHead->next=head;//定位要反转的链表区间并保存区间的前一个和后一个节点ListNode* left=head;ListNode* preLeft=nullptr;ListNode* right=head;ListNode* lastRight=nullptr;for(int i=0;i<m-1;i++){if(i==m-2) preLeft=left;left=left->next;}for(int i=0;i<n-1;i++){right=right->next;}lastRight=right->next;right->next=nullptr;//断开原链表//反转区间链表ListNode* pre=preLeft;ListNode* cur=left;ListNode* next=nullptr;while(cur){next=cur->next;//保存下一个节点cur->next=pre;//反转链表pre=cur;//更新前一个节点cur=next;//更新当前节点}if(preLeft!=nullptr) preLeft->next=right;//第一个节点没有被反转else pHead->next=right;//第一个节点被反转了left->next=lastRight;return pHead->next;}
};

还有一种不需要将区间链表取出来,直接在原链表上进行反转的方法,原理如下图:

class Solution {
public:ListNode* reverseBetween(ListNode* head, int m, int n) {//加个表头ListNode* res = new ListNode(-1);res->next = head;//前序节点ListNode* pre = res; //当前节点ListNode* cur = head; //找到mfor(int i = 1; i < m; i++){ pre = cur;cur = cur->next;}//从m反转到nfor(int i = m; i < n; i++){ ListNode* temp = cur->next;cur->next = temp->next;temp->next = pre->next;pre->next = temp;}//返回去掉表头return res->next; }
};
http://www.xdnf.cn/news/2418.html

相关文章:

  • 在 Ubuntu24.04 LTS 上 Docker 部署英文版 n8n 和 部署中文版 n8n-i18n-chinese
  • 前端自定义文本生成文件下载
  • 第八章 IO流
  • 树状数组详解
  • ZBrush2025建模软件下载 ZBrush中文版免费下载 ZBrush版本大全
  • 数据预处理中比较重要的知识点
  • 【白雪讲堂】
  • CPU与GPU的功能与区别解析
  • 【LCMM】纵向轨迹模型,组轨迹模型
  • c++学习小结
  • AUTOSAR图解==>AUTOSAR_SWS_StandardTypes
  • PotPlayer,强大的高清视频播放器
  • 使用 Spring Boot 进行开发
  • TypeScript基础数据类型详解
  • 多数元素(简单)
  • VSCode远程登录云服务器并设置免密登录全攻略
  • java每日精进 4.26【多租户之过滤器及请求处理流程】
  • llama factory怎么命令行推理图片
  • java—基础
  • A. Everybody Likes Good Arrays!
  • Java 程序运行和类路径处理
  • map和set的应用总结
  • MySQL 常用语句教程
  • Python数值类型修炼手册:从青铜到王者的进阶之路
  • Buffer Pool是什么,有什么作用
  • 【MATLAB第118期】基于MATLAB的双通道CNN多输入单输出分类预测方法
  • Android学习总结之协程对比优缺点(协程一)
  • 腾讯云智三道算法题
  • 侵水防触电的原理是什么? 侵水防触电算先进技术吗?-优雅草卓伊凡
  • 【Redis——通用命令】