题目描述

反转从位置 mn 的链表。请使用一趟扫描完成反转。

说明:
1 ≤ m ≤ n ≤ 链表长度。

示例:

输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL

解题思路

本题类似于反转链表的做法,但不同的是只反转中间的一段节点,所以在反转完一段链表后,应重新拼接到原链表对应位置中间。具体步骤为:

  • 首先找到反转链表的首尾节点,若首节点不是链表头结点,还要同时保存首节点的前一个节点,以便反转完后的拼接
  • 然后按照反转链表的做法维护三个指针,从头到尾一遍遍历调整指针,这样遍历到尾节点时正好反转完指定链表段
  • 最后将原来的首节点next指针指向段后节点,若首节点不是链表头结点,还要讲首节点前一个节点的next指针指向原来的尾节点

代码

 /**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
ListNode *left = head, *first, *pre;
int step = m;
while(step - > ){
left = left->next;
step--;
}
if(m > ) first = pre = left->next;
else first = pre = head;
step = n - m;
if(step > ){
ListNode *now = pre->next;
ListNode *next = now->next;
while(step-- > ){
now->next = pre;
pre = now;
now = next;
if(next) next = now->next;
}
if(m > ) left->next = pre;
first->next = now;
}
if(m > ) return head;
else return pre;
}
};

最新文章

  1. bzoj1179(Atm)
  2. VS10x CodeMap 注册码 key VS插件CodeMap
  3. text-transform设置单词首字母大写
  4. JS写四个图片滚动显示的效果
  5. 字符串复制char *strcpy(char* dest, const char *src);
  6. Leetcode#166 Fraction to Recurring Decimal
  7. Git教程(2)官方命令文档及常用命令表
  8. Linux查询系统配置常用命令
  9. pulltorefresh 设置刷新文字提示颜色
  10. WPF DataTriger 用法示例代码
  11. freemarker写select组件报错总结(二)
  12. heartbeat.go
  13. MaxCompute/DataWorks权限问题排查建议
  14. codevs 2606 约数和(分块优化数学公式 )
  15. 开源工具软件XMusicDownloader——音乐下载神器
  16. vue-infinite-loading2.0 中文文档
  17. gis cad导出弧段在arcmap下 不准问题
  18. shell基础--test命令的使用
  19. 求幂大法,矩阵快速幂,快速幂模板题--hdu4549
  20. 集合set、map、list

热门文章

  1. Mysql学习(四)之通过homebrew安装mysql后,为什么在系统偏好设置里没有mysql
  2. @RequestMapping-占位符映射
  3. 部署Dashboard,监控应用
  4. springboot页面模板thymeleaf的简单用法
  5. 19 Python之面向对象(成员)
  6. 把两个object对象合并成一个对象 属性名称相同的变为后面对象的值
  7. PID应用详解
  8. Spring框架中<mvc:default-servlet-handler/>的作用
  9. 11、Nginx反向代理服务
  10. npm安装node-sass报msbuild相关错误的解决办法