力扣92(java&python)-反转链表Ⅱ(中等)
题目:
给你单链表的头指针 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
进阶: 你可以使用一趟扫描完成反转吗?
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/reverse-linked-list-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
一、头插法
1.首先定义一个虚拟头结点指向原始头结点,可以减少对头结点的特殊处理,将头结点当做普通结点处理;
2.定义两个指针一个为pre,一个为cur;
3.确定pre和cur指针的位置,需要根据题中给定的left值进行确定,将pre移动到第一个需要反转的结点的前面,将cur移动到需要反转的第一个结点上;
4.将cur后面一个结点temp保存,将当前cur指向cur的下下个结点,即cur.next=cur.next.next , 然后将保存的结点插入到pre后面;
5.重复步骤4;
6.最后返回dummyHead.next。


解释:
temp.next = pre.next这里为什么不能写成temp.next = cur?
看上面的图解就可以看出,cur所指向的结点没有变过,但是所在的位置是一直在变化的,pre和cur中间会一直插入结点,而每次插入都是在pre的后面。如果写成temp.next = cur就会删除上面已经反转的结点,比如4和3。
java代码:
1 /**
2 * Definition for singly-linked list.
3 * public class ListNode {
4 * int val;
5 * ListNode next;
6 * ListNode() {}
7 * ListNode(int val) { this.val = val; }
8 * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
9 * }
10 */
11 class Solution {
12 public ListNode reverseBetween(ListNode head, int left, int right) {
13 ListNode dummyHead = new ListNode(0,head);
14 //定义两个指针pre和cur
15 ListNode pre = dummyHead;
16 ListNode cur = dummyHead.next;
17
18 //先确定两个指针的初始位置,pre应该在left-1,cur=left
19 for(int i = 1; i < left; i++){
20 pre = pre.next;
21 cur = cur.next;
22 }
23 //插入
24 for(int j = 1; j < right - left + 1; j++){
25 //保存cur的下一个结点
26 ListNode temp = cur.next;
27 //使cur指向它的下下个结点
28 cur.next = cur.next.next;
29 //将保存的结点插入
30 temp.next = pre.next;
31 pre.next = temp;
32 }
33 return dummyHead.next;
34
35 }
36 }

python3代码:
1 # Definition for singly-linked list.
2 # class ListNode:
3 # def __init__(self, val=0, next=None):
4 # self.val = val
5 # self.next = next
6 class Solution:
7 def reverseBetween(self, head: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:
8 dummyHead = ListNode(0,head)
9 pre,cur = dummyHead,dummyHead.next
10
11 # 确定pre和cur的位置
12 for i in range(1,left):
13 cur = cur.next
14 pre = pre.next
15
16 # 插入操作
17 for i in range(1,right-left+1):
18 temp = cur.next
19 # 如果temp是尾结点cur.next为none
20 cur.next = temp.next if temp else None
21
22 temp.next = pre.next
23 pre.next = temp
24
25 return dummyHead.next

二、递归
1 /**
2 * Definition for singly-linked list.
3 * public class ListNode {
4 * int val;
5 * ListNode next;
6 * ListNode() {}
7 * ListNode(int val) { this.val = val; }
8 * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
9 * }
10 */
11 class Solution {
12 public ListNode reverseBetween(ListNode head, int left, int right) {
13 if (left == 1){
14 return reversTopN(head, right);
15 }
16 //翻转
17 ListNode between = reverseBetween(head.next, left-1, right-1);
18 //将翻转后的新头结点挂在原来的head之后
19 head.next = between;
20 //返回链表
21 return head;
22 }
23 //nextnode第n个结点之后的结点
24 ListNode nextnode = null;
25 private ListNode reversTopN(ListNode head, int n){
26 //如果只翻转一个,把下一个结点直接放在头结点后
27 if(n == 1){
28 nextnode = head.next;
29 return head;
30 }
31 ListNode newHead = reversTopN(head.next, n-1);
32 //头结点的下一个结点指向头结点
33 head.next.next = head;
34 head.next = nextnode;
35 return newHead;
36 }
37 }

力扣92(java&python)-反转链表Ⅱ(中等)的更多相关文章
- 力扣(LeetCode)反转链表 个人题解
反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶:你可以迭代或 ...
- 力扣 - 92. 反转链表II
目录 题目 思路1(迭代) 代码 复杂度分析 思路2(递归) 代码 复杂度分析 题目 92. 反转链表 II 思路1(迭代) 将反转链表分成3个部分:前一段未反转的部分.待反转链表部分.后一段未反转部 ...
- 力扣—Reorder List(重排链表)python实现
题目描述: 中文: 给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点 ...
- 力扣——Partition List(分隔链表) python实现
题目描述: 中文: 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前. 你应当保留两个分区中每个节点的初始相对位置. 示例: 输入: head = ...
- 【力扣】82. 删除排序链表中的重复元素 II
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字. 返回同样按升序排列的结果链表. 示例 1: 输入:hea ...
- 第92题:反转链表II
一. 问题描述 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4->5->NUL ...
- LeetCode(92):反转链表 II
Medium! 题目描述: 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明:1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4->5-&g ...
- 力扣题目汇总(反转字符串中的单词,EXCEL表列序号,旋置矩阵)
反转字符串中的单词 III 1.题目描述 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. 示例 1: 输入: "Let's take LeetCode ...
- 力扣(LeetCode)环形链表 个人题解
给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. 示例 1: 输入: ...
- 力扣题解-面试题22. 链表中倒数第K个节点
题目描述 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点.例如,一个链表有6个节点,从头节点开始,它们的值依次是1.2.3.4.5. ...
随机推荐
- 心电芯片ADS1292 KS1081 AD8232等的比较
首先看ADS1292, 从品牌和信誉,TI出品,这个来说应该是相对好一点的,医疗级水准的信号.内置24位的ADC,,噪声和整体功能都很全面,放大倍数1-12倍.应用在穿戴场合的缺点是:这个芯片封装尺寸 ...
- 恒玄科技BES2500芯片OTA升级调试总结和源码分析
一 前言 bes2500芯片在tws耳机应用十分广泛,该芯片有着资源强大,音质好,大厂背书等特色.吸引了不少粉丝跟随. 最近在调试该芯片的ota功能,花费了一些时间,踩了一些坑,这里做一个总结和备忘吧 ...
- 关于api的表优化及代码优化小结
提示:近期有空整理下mysql设计注意点吧 文章目录 一.表设计方面 二.代码设计方面 总结 一.表设计方面 建表要求三范式 5个必须字段is_del,create_time(CURRENT_TIME ...
- 记录--两行CSS让页面提升了近7倍渲染性能
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 对于前端人员来讲,最令人头疼的应该就是页面性能了,当用户在访问一个页面时,总是希望它能够快速呈现在眼前并且是可交互状态.如果页面加载 ...
- node-xlsx处理excel
引用node-xlsx npm install node-xlsx -save 文件中引用 const xlsx = require('node-xlsx') 读取excel const sheet ...
- 什么是HSV色彩空间
BGR色彩空间是基于三基色而言,即红色.绿色.蓝色.而HSV色彩空间则是基于色调.饱和度和亮度而言的. 色调(H)是指光的颜色,例如,彩虹中的赤,橙,黄,绿,青,蓝,紫分别表示不同的色调.在OpenC ...
- Oracle 触发器迁移至KingbaseES常见的问题
oracle数据库的触发器迁移到KingbaseES的时候经常会出现一下两类错误: 1.SQL 错误 [42809]: 错误: "xxxxxxxx" 是一个视图.Detail: 视 ...
- vue前后端分离项目,使用宝塔面板解决跨域问题,设置Nginx反向代理
开发环境解决跨域问题: 使用教程 跨域解决本地跨域问题 非唯一方法 生成环境解决跨域问题: 1.创建站点 2.把打包的vue项目dist发送解压到站点里面 ,选择静态模式 3.然后设置反向代理 目标u ...
- #并查集#JZOJ 4223 旅游
题目 多次询问有多少个无序点对\((x,y)\), 满足至少有一条最大边权\(\leq d\)的路径 分析 离线询问,用并查集加边,每次产生的贡献为\(2*siz[x]*siz[y]\) 代码 #in ...
- #Every-SG#HDU 3595 GG and MM
题目 有\(n\)个游戏,每个游戏只要能进行就必须进行, 对于每个游戏有两堆石子,每次可以将数量多的中取出小堆石子数量的整数倍, 无法操作者为负,问先手是否必胜 分析 如果单个游戏最大操作次数为奇数次 ...