LeetCode 中等难度 92. 反转链表 II解题思路
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解题思路相关推荐
- 92. 反转链表 II golang
92. 反转链表 II 注意最后对于链表反转的操作,应该熟记 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2-&g ...
- 92. 反转链表 II【穿针引线、头插法(tmp.next、pre.next 太妙了,绝绝子~)】
92. 反转链表 II 穿针引线法: 如果[需要从头开始反转],则需要加[虚拟头结点]. class Solution { // java 穿针引线public ListNode reverseBet ...
- LeetCode 92 ——反转链表 II
1. 题目 2. 解答 我们需要先找到第 m 个结点及其上一个结点,然后将从 m 到 n 的结点进行反转,最后依次将 m 到 n 反转后的结点和 n 之后的结点放入原链表中即可. 从前往后依次遍历 m ...
- LeetCode 272 Closest Binary Tree Traversal II 解题思路
原题网址:https://leetcode.com/problems... Given a non-empty binary search tree and a target value, find ...
- Leetcode 107. 二叉树的层次遍历 II 解题思路及C++实现
解题思路: 使用队列实现二叉树的层序遍历,因为题目中要求每一层的val存储在一个vector中,所以在内循环中,还需要一个队列,用以存储更新每一层的节点. 在最后,需要将得到的res数组逆序. /** ...
- Leetcode 122. 买卖股票的最佳时机 II 解题思路及C++实现
解题思路: 采用贪心策略,只要后一天的价格高于前一天,就将差价加进来.得到的结果就是能获取的最大利润. class Solution { public:int maxProfit(vector< ...
- LeetCode 92. 反转链表 II(双指针)
1. 题目 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. 示例:输入: 1->2->3->4->5->NULL, ...
- 27. Leetcode 92. 反转链表 II (链表-反转链表)
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right .请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 .示例 1 ...
- Leetcode 92 反转链表 II (每日一题 20210726)
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right .请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 .示例 1 ...
最新文章
- 两位一体数码管引脚图_两位一体共阴数码管,第二位数字显示不出来,按钮第7按钮按下去来回显示,但第一位又不显示了,,,急...
- Dataframe花样切片~(Python)
- 不建议在Docker中部署数据库
- 【Python】学习笔记总结4(Python模块)
- LeetCode 510. 二叉搜索树中的中序后继 II(查找右子树或者祖父节点)
- apollo源码分析 感知_Kitty中的动态线程池支持Nacos,Apollo多配置中心了
- console.log打印值,颜色 - 解决篇
- 伟大的RAC和MVVM入门(二)
- Debugview调试视图
- 禁止文本框输入空格和回车
- Xshell5 注册码 ,Xftp5 注册码,Xmanager5注册码
- android地球经纬度平面图,地球经纬度划分图高清 怎么划分经纬度
- Ubuntu18.04 域名解析失败
- 男は失恋夜盗11台奔スポーツカーエンブレム腹いせ(写真)
- 操作系统4小时速成:内存管理,程序执行过程,扩充内存,连续分配,非连续分配,虚拟内存,页面替换算法
- vga转html电脑打不开,如何解决HDMI到VGA转换的常见故障_四种解决方法
- STATA regress回归结果分析
- python 循序渐进学习:输出线段图案、正方形图案、直角三角形图案、翻转直角三角形图案、带空格直角三角形图案
- Linux的基本指令(一):常用基础指令
- 国内康复核心期刊的统计
热门文章
- Genymotion的使用 -- A Faster Android Emulator
- Ubuntu 10.10 安装配置 Ruby on Rails
- [转]bootstrap table 动态列数
- Netty中的线程处理EventLoop
- DHCP服务器禁用NetBios功能后引发WPAD失效解决方法
- appium===元素定位
- 《Adobe Flash Professional CC经典教程》——1.13 查找关于使用Flash的资源
- jvm系列(十):如何优化Java GC「译」
- 网页开发——从接触到编写输出一个DIV
- 交互设计新人的核心竞争力