栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

92. 反转链表 II(leetcode)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

92. 反转链表 II(leetcode)

92. 反转链表 II

 

难度:中等

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

示例 1:

 输入:head = [1,2,3,4,5], left = 2, right = 4
 输出:[1,4,3,2,5]

示例 2:

 输入:head = [5], left = 1, right = 1
 输出:[5]

提示:

  • 链表中节点数目为 n

  • 1 <= n <= 500

  • -500 <= Node.val <= 500

  • 1 <= left <= right <= n


        吾有一法,可称之为头插法的变态应用。

        法源:遍历区域内的节点,运用头插法的思维,遍历完区域内的节点后,区域内的链表将倒置。

如图:

 

        

        1.定义三个指针变量:pre指向序号 left 前一个节点, cur指向left对应的节点,next =nullptr;

        2.next = cur->next ,将next指向的节点插到区域链表的开头,如图中的第二次图解 cur->next = next->next; next->next = pre->next; pre->next = next;  注意先后顺序不能乱。

        3.重复2操作,直至遍历完范围区域.

易错:步骤2链表操作容易想错,不是pre->next->next连接next->next,而是cur->next = next->next 

源码:

class Solution {
 public:
     ListNode *reverseBetween(ListNode *head, int left, int right) {
        
         ListNode *dummy = new ListNode(-1);
         dummy->next = head;
         ListNode *pre = dummy;
         for( int i = 0; i < left-1; ++ i ) {  
             pre = pre->next;
         }
         ListNode *cur = pre->next,*next=nullptr;
         for( int i = 0; i < right - left; ++ i ) {
             next = cur->next;
             cur->next = next->next;
             next->next = pre->next;
             pre->next = next; 
         }
         ListNode *tmp = dummy->next;
         delete dummy;
         return tmp;
     }
 };

编程中可能会遇到的问题:

        1.头节点的特判问题,利用dummy哑节点解决。

        2.第一个for循环中注意pre的位置,确定i的终止条件。

        3.第二个 for 循环中,i的终止条件:因为next从 left 的节点的下一个节点遍历,所以遍历的节点数为(right - left),而不是(right - left+1)。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/833122.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号