LeetCode 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

进阶: 你可以使用一趟扫描完成反转吗?

python 复制代码
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def reverseBetween(self, head: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:
        if left == right:
            return head
        head = first_start = ListNode(next=head)
        counter = 0
        while head:
            if counter < left - 1:
                head = head.next
            elif counter == left - 1:
                first_end = head
                head = head.next
            elif counter == left:
                second_start = head
                pre = head
                head = head.next
            elif counter < right:
                tmp = head.next
                head.next = pre
                pre = head
                head = tmp
            elif counter == right:
                second_end = head
                third_start = head.next
                head.next = pre
                pre = None
                # 拼接
                first_end.next = second_end
                second_start.next = third_start
                return first_start.next
            else:
                break
            counter += 1

时间复杂度 O(n):一个大循环最多遍历链表完整一次,计O(n)。共O(n)。

空间复杂度 O(1):常量。共 O(1)。

还是官解写的简洁

python 复制代码
class Solution:
    def reverseBetween(self, head: ListNode, left: int, right: int) -> ListNode:
        # 设置 dummyNode 是这一类问题的一般做法
        dummy_node = ListNode(-1)
        dummy_node.next = head
        pre = dummy_node
        for _ in range(left - 1):
            pre = pre.next

        cur = pre.next
        for _ in range(right - left):
            next = cur.next
            cur.next = next.next
            next.next = pre.next
            pre.next = next
        return dummy_node.next

# 作者:力扣官方题解
# 链接:https://leetcode.cn/problems/reverse-linked-list-ii/solutions/634701/fan-zhuan-lian-biao-ii-by-leetcode-solut-teyq/
# 来源:力扣(LeetCode)
# 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
相关推荐
budingxiaomoli16 小时前
算法--滑动窗口(一)
数据结构·算法
王哈哈^_^17 小时前
【数据集】【YOLO】【目标检测】农作物病害数据集 11498 张,病害检测,YOLOv8农作物病虫害识别系统实战训推教程。
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·1024程序员节
xier_ran17 小时前
邻接矩阵的 k 次幂意味着什么?从图论到路径计数的直观解释
算法·图论
B站_计算机毕业设计之家18 小时前
预测算法:股票数据分析预测系统 股票预测 股价预测 Arima预测算法(时间序列预测算法) Flask 框架 大数据(源码)✅
python·算法·机器学习·数据分析·flask·股票·预测
想唱rap19 小时前
C++ list 类的使用
c语言·开发语言·数据结构·c++·笔记·算法·list
l1t19 小时前
利用DuckDB SQL求解集合数学题
数据库·sql·算法·集合·duckdb
yuyanjingtao19 小时前
CCF-GESP 等级考试 2024年9月认证C++四级真题解析
c++·算法·青少年编程·gesp·csp-j/s
微笑尅乐19 小时前
洗牌算法讲解——力扣384.打乱数组
算法·leetcode·职场和发展
Lei_33596719 小时前
[算法]背包DP(01背包、完全背包问题、多重背包、分组背包、混合背包问题、有依赖的背包问题等)
c++·算法
uesowys19 小时前
华为OD算法开发指导-比赛的冠亚季军
算法·华为od