当前位置:   article > 正文

LeetCode 第 92 号问题:反转链表 II

吴师兄 将一个链表从m位置反向到n

本文首发于公众号「五分钟学算法」,是 图解 LeetCode 系列文章之一。
个人网站: https://www.cxyxiaowu.com

题目来源于 LeetCode 上第 92 号问题:反转链表 II。题目难度为 Medium,目前通过率为 43.8% 。

题目描述

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

说明: 1 ≤ mn ≤ 链表长度。

示例:

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

题目解析

Reverse Linked List的延伸题。

可以考虑取出需要反转的这一小段链表,反转完后再插入到原先的链表中。

以本题为例:

变换的是 2,3,4这三个点,那么我们可以先取出 2 ,用 front 指针指向 2 ,然后当取出 3 的时候,我们把 3 加到 2 的前面,把 front 指针前移到 3 ,依次类推,到 4 后停止,这样我们得到一个新链表 4 -> 3 -> 2 , front 指针指向4。

对于原链表来说,有两个点的位置很重要,需要用指针记录下来,分别是 1 和 5 ,把新链表插入的时候需要这两个点的位置。

  • 用 pre 指针记录 1 的位置
  • 当 4 结点被取走后,5 的位置需要记下来
  • 这样我们就可以把倒置后的那一小段链表加入到原链表中

动画描述


v2-cce4638062603b883631e60f34bfd0e3_b.gif


代码实现

        
  1. class Solution {
  2. public:
  3. ListNode *reverseBetween(ListNode *head, int m, int n) {
  4. ListNode *dummy = new ListNode(-1);
  5. dummy->next = head;
  6. ListNode *cur = dummy;
  7. ListNode *pre, *front, *last;
  8. for (int i = 1; i <= m - 1; ++i) cur = cur->next;
  9. pre = cur;
  10. last = cur->next;
  11. for (int i = m; i <= n; ++i) {
  12. cur = pre->next;
  13. pre->next = cur->next;
  14. cur->next = front;
  15. front = cur;
  16. }
  17. cur = pre->next;
  18. pre->next = front;
  19. last->next = cur;
  20. return dummy->next;
  21. }
  22. };


v2-3af2339a6056d546cf4383d39233e8fa_b.jpg

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/209526
推荐阅读
相关标签
  

闽ICP备14008679号