Reverse a linked list from position m to n. Do it in one-pass.

Note: 1 ≤ m ≤ n ≤ length of list.

Example:

Input: 1->2->3->4->5->NULL, m = 2, n = 4
Output: 1->4->3->2->5->NULL

很奇怪为何没有倒置链表之一,就来了这个倒置链表之二,不过猜也能猜得到之一就是单纯的倒置整个链表,而这道作为延伸的地方就是倒置其中的某一小段。对于链表的问题,根据以往的经验一般都是要建一个dummy node,连上原链表的头结点,这样的话就算头结点变动了,我们还可以通过dummy->next来获得新链表的头结点。这道题的要求是只通过一次遍历完成,就拿题目中的例子来说,变换的是2,3,4这三个点,我们需要找到第一个开始变换结点的前一个结点,只要让pre向后走m-1步即可,为啥要减1呢,因为题目中是从1开始计数的,这里只走了1步,就是结点1,用pre指向它。万一是结点1开始变换的怎么办,这就是我们为啥要用dummy结点了,pre也可以指向dummy结点。然后就要开始交换了,由于一次只能交换两个结点,所以我们按如下的交换顺序:

1 -> 2 -> 3 -> 4 -> 5 -> NULL

1 -> -> -> 4 -> 5 -> NULL

1 -> -> -> -> 5 -> NULL

我们可以看出来,总共需要n-m步即可,第一步是将结点3放到结点1的后面,第二步将结点4放到结点1的后面。这是很有规律的操作,那么我们就说一个就行了,比如刚开始,pre指向结点1,cur指向结点2,然后我们建立一个临时的结点t,指向结点3(注意我们用临时变量保存某个结点就是为了首先断开该结点和前面结点之间的联系,这可以当作一个规律记下来),然后我们断开结点2和结点3,将结点2的next连到结点4上,也就是 cur->next = t->next,再把结点3连到结点1的后面结点(即结点2)的前面,即 t->next = pre->next,最后再将原来的结点1和结点2的连接断开,将结点1连到结点3,即 pre->next = t。这样我们就完成了将结点3取出,加入结点1的后方。第二步将结点4取出,加入结点1的后方,也是同样的操作,这里就不多说了,请大家自己尝试下吧,参见代码如下:

class Solution {
public:
ListNode *reverseBetween(ListNode *head, int m, int n) {
ListNode *dummy = new ListNode(-), *pre = dummy;
dummy->next = head;
for (int i = ; i < m - ; ++i) pre = pre->next;
ListNode *cur = pre->next;
for (int i = m; i < n; ++i) {
ListNode *t = cur->next;
cur->next = t->next;
t->next = pre->next;
pre->next = t;
}
return dummy->next;
}
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/92

类似题目:

Reverse Linked List

参考资料:

https://leetcode.com/problems/reverse-linked-list-ii/

https://leetcode.com/problems/reverse-linked-list-ii/discuss/30668/12-lines-4ms-C%2B%2B

LeetCode All in One 题目讲解汇总(持续更新中...)

最新文章

  1. Oozie调度报错——ORA-00918:未明确定义列
  2. Win7系统修改hosts文件不能保存的解决方法
  3. 分享Kali Linux 2016.2第47周虚拟机
  4. python之map、filter、reduce、lambda函数
  5. insertAdjacentHTML
  6. Python多线程,threading的用法
  7. 福建省队集训被虐记——DAY4
  8. [置顶] C++ sizeof实例详解
  9. ubuntu12.04硬盘安装
  10. think in uml 1
  11. 【GDOI2016模拟3.16】幂(容斥 + 模型复杂转化)
  12. flask的migrate
  13. python的优点
  14. swift 颜色设置方法
  15. Ansible-playbook的简单使用 [转]
  16. js实现svg图形转存为图片下载[转]
  17. 视频支持拖动进度条播放的实现(基于nginx)
  18. 自己写了一个图片的马赛克消失效果(jQuery)
  19. hibernate查询出的实体,set值后,自动更新到数据库
  20. Axure知识点

热门文章

  1. spring 事务 XML
  2. 使用AspectCore实现AOP模式的Redis缓存
  3. .NET 跨域问题解决
  4. Python - 迭代器与生成器 - 第十三天
  5. scrapy学习笔记(一)
  6. Java生鲜电商平台-redis缓存在商品中的设计与架构
  7. Android App自动化测试实战(基于Python)(三)
  8. Java基础—实现多线程的三种方法
  9. i春秋四周年福利趴丨一纸证书教你赢在起跑线
  10. maven 学习---Maven构建自动化-Hudson