92. 反转链表 II

题目:中等难度

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

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

示例:

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

解题思路:
1.基础首先是普通链表反转,也就是需要一个新链表头指针new_head指向新链表的头部,然后从旧链表里找到需要反转的节点利用头插法插入到新链表里。
2.着重点是找到需要反转的节点------按位查找。
3.需要标记旧链表里的四个特殊节点,反转完毕后连接成目标链表。如下图

4.把反转后3里找到的四个节点重新链接即可。

总结:主体框架是按位查找+链表反转+重要位置节点的标记

需要注意的几个点:

1.以上四个指针的初始赋值问题,第一个指针不能直接赋值head。因为如果m等于1时,这个指针的值应为Null。重点需要注意第一个指针是NULL的情况。
2.反转时创建了新的链表,利用头插法把旧链表的头结点插到新链表时,要提前用一个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* pre_head=NULL;    //反转部分的前一个节点——有可能为空(即m为1的情况)ListNode* new_head=NULL;    //反转后的链头ListNode* list_tail=NULL;  //反转后的链尾ListNode* result=head;   //返回值ListNode* next;           //反转时用来标记原链表的指针int len=n-m+1;              // 反转的节点的数量// 寻找需要反转的第一个节点while(head&&--m)          {               pre_head=head;             //1.指针跟随head=head->next;           //2.指针下移}list_tail=head;             //反转部分之前的链头就是反转之后的链尾//实现反转部分  while(head&&(len--))      {   next=head->next;        //先标记原链表的下一个节点head->next=new_head;    //把原链表的第一个节点插入到新链表的头new_head=head;          //更新新链表的头结点指针head=next;              //更新旧链表的头结点指针}list_tail->next=head;//判断健壮性 --注意pre_head为null的情况if(pre_head)               {pre_head->next=new_head;}else{result=new_head;}return result;}
};

LeetCode 中等难度 92. 反转链表 II解题思路相关推荐

  1. 92. 反转链表 II golang

    92. 反转链表 II 注意最后对于链表反转的操作,应该熟记 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2-&g ...

  2. 92. 反转链表 II【穿针引线、头插法(tmp.next、pre.next 太妙了,绝绝子~)】

    92. 反转链表 II 穿针引线法: 如果[需要从头开始反转],则需要加[虚拟头结点]. class Solution { // java 穿针引线public ListNode reverseBet ...

  3. LeetCode 92 ——反转链表 II

    1. 题目 2. 解答 我们需要先找到第 m 个结点及其上一个结点,然后将从 m 到 n 的结点进行反转,最后依次将 m 到 n 反转后的结点和 n 之后的结点放入原链表中即可. 从前往后依次遍历 m ...

  4. LeetCode 272 Closest Binary Tree Traversal II 解题思路

    原题网址:https://leetcode.com/problems... Given a non-empty binary search tree and a target value, find  ...

  5. Leetcode 107. 二叉树的层次遍历 II 解题思路及C++实现

    解题思路: 使用队列实现二叉树的层序遍历,因为题目中要求每一层的val存储在一个vector中,所以在内循环中,还需要一个队列,用以存储更新每一层的节点. 在最后,需要将得到的res数组逆序. /** ...

  6. Leetcode 122. 买卖股票的最佳时机 II 解题思路及C++实现

    解题思路: 采用贪心策略,只要后一天的价格高于前一天,就将差价加进来.得到的结果就是能获取的最大利润. class Solution { public:int maxProfit(vector< ...

  7. LeetCode 92. 反转链表 II(双指针)

    1. 题目 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. 示例:输入: 1->2->3->4->5->NULL, ...

  8. 27. Leetcode 92. 反转链表 II (链表-反转链表)

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

  9. Leetcode 92 反转链表 II (每日一题 20210726)

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

最新文章

  1. 两位一体数码管引脚图_两位一体共阴数码管,第二位数字显示不出来,按钮第7按钮按下去来回显示,但第一位又不显示了,,,急...
  2. Dataframe花样切片~(Python)
  3. 不建议在Docker中部署数据库
  4. 【Python】学习笔记总结4(Python模块)
  5. LeetCode 510. 二叉搜索树中的中序后继 II(查找右子树或者祖父节点)
  6. apollo源码分析 感知_Kitty中的动态线程池支持Nacos,Apollo多配置中心了
  7. console.log打印值,颜色 - 解决篇
  8. 伟大的RAC和MVVM入门(二)
  9. Debugview调试视图
  10. 禁止文本框输入空格和回车
  11. Xshell5 注册码 ,Xftp5 注册码,Xmanager5注册码
  12. android地球经纬度平面图,地球经纬度划分图高清 怎么划分经纬度
  13. Ubuntu18.04 域名解析失败
  14. 男は失恋夜盗11台奔スポーツカーエンブレム腹いせ(写真)
  15. 操作系统4小时速成:内存管理,程序执行过程,扩充内存,连续分配,非连续分配,虚拟内存,页面替换算法
  16. vga转html电脑打不开,如何解决HDMI到VGA转换的常见故障_四种解决方法
  17. STATA regress回归结果分析
  18. python 循序渐进学习:输出线段图案、正方形图案、直角三角形图案、翻转直角三角形图案、带空格直角三角形图案
  19. Linux的基本指令(一):常用基础指令
  20. 国内康复核心期刊的统计

热门文章

  1. Genymotion的使用 -- A Faster Android Emulator
  2. Ubuntu 10.10 安装配置 Ruby on Rails
  3. [转]bootstrap table 动态列数
  4. Netty中的线程处理EventLoop
  5. DHCP服务器禁用NetBios功能后引发WPAD失效解决方法
  6. appium===元素定位
  7. 《Adobe Flash Professional CC经典教程》——1.13 查找关于使用Flash的资源
  8. jvm系列(十):如何优化Java GC「译」
  9. 网页开发——从接触到编写输出一个DIV
  10. 交互设计新人的核心竞争力