【Leetcode刷题Python】92.反转链表II

简介: LeetCode上题目“92. 反转链表 II”的Python解决方案,其中包括两种方法:一种是头插法,另一种是迭代法。迭代法涉及先截取链表的一部分,然后反转这部分链表,最后将反转后的部分重新连接到原链表中。

1 题目

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

2 解析

(1)第一种:头插法

(2)第二种:迭代法,先截取中间部分,然后反转,再连接两头

(3)第三种:递归法

待更新

3 Python实现

class Solution:
    # 方法一:头插法
    '''
    def reverseBetween(self, head: ListNode, left: int, right: int) -> ListNode:
        dummy = ListNode(-1)
        dummy.next = head
        prev = dummy
        for _ in range(left-1):
            prev = prev.next
        curr = prev.next
        for _ in range(right-left):
            next_node = curr.next
            curr = next_node.next
            next_node.next = prev.next
            prev.next = next_node
        return dummy
    '''
    # 方法二:迭代法
    def reverseBetween(self, head: ListNode, left: int, right: int) -> ListNode:
        def reverseList(head: ListNode):
            pre = None
            cur = head
            while cur:
                next = cur.next
                cur.next = pre
                pre = cur
                cur = next
        dummy_node = ListNode(-1)
        dummy_node.next = head
        prev  = dummy_node
        for _ in range(left-1):
            prev = prev.next
        right_node = prev
        for _ in range(right-left+1):
            right_node = right_node.next
        # 保存节点
        left_node = prev.next
        curr = right_node.next
        # 切断链表
        prev.next = None
        right_node.next = None
        reverseList(left_node)
        # 恢复连接
        # 注意,此处右node变成了左node,左node变成了右node。
        prev.next = right_node
        left_node.next = curr
        return  dummy_node.next
目录
相关文章
|
29天前
|
程序员
【刷题记录】移除链表元素
【刷题记录】移除链表元素
|
27天前
|
算法
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点
|
27天前
|
存储 算法
LeetCode第86题分隔链表
文章介绍了LeetCode第86题"分隔链表"的解法,通过创建两个新链表分别存储小于和大于等于给定值x的节点,然后合并这两个链表来解决问题,提供了一种简单易懂且操作原链表的解决方案。
LeetCode第86题分隔链表
|
27天前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
27天前
|
算法
LeetCode第23题合并 K 个升序链表
这篇文章介绍了LeetCode第23题"合并K个升序链表"的解题方法,使用分而治之的思想,通过递归合并链表的方式解决了这个难题。
LeetCode第23题合并 K 个升序链表
|
15天前
|
C++ 索引
leetcode 707.设计链表
本文提供了解决LeetCode 707题"设计链表"的C++实现,包括单链表的节点定义和类方法实现,如添加节点、获取节点值、删除节点等。
|
27天前
|
算法
LeetCode第92题反转链表 II
文章分享了LeetCode第92题"反转链表 II"的解法,通过使用四个指针来记录和更新反转链表段的头部、尾部以及前一个和后一个节点,提供了一种清晰且易于理解的解决方案。
LeetCode第92题反转链表 II
|
27天前
|
算法
LeetCode第21题合并两个有序链表
该文章介绍了 LeetCode 第 21 题合并两个有序链表的解法,通过创建新链表,依次比较两个链表的头节点值,将较小的值插入新链表,直至其中一个链表遍历完,再将另一个链表剩余部分接到新链表后面,实现合并。
LeetCode第21题合并两个有序链表
|
27天前
|
算法
LeetCode第19题删除链表的倒数第 N 个结点
该文章介绍了 LeetCode 第 19 题删除链表的倒数第 N 个结点的解法,通过使用快慢双指针,先将快指针移动 n 步,然后快慢指针一起遍历,直到快指针到达链尾,从而找到倒数第 N 个结点的前一个结点进行删除,同时总结了快慢指针可减少链表遍历次数的特点。
LeetCode第19题删除链表的倒数第 N 个结点
|
29天前
【刷题记录】链表的回文结构
【刷题记录】链表的回文结构