面试150 反转链表Ⅱ

发布于:2025-07-09 ⋅ 阅读:(19) ⋅ 点赞:(0)

在这里插入图片描述

思路

同样将链表转为列表,然后通过列表的操作,先对指定位置的元素进行反转。然后对反转后的列表进行新建链表。

# 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 not head:
            return None
        if left==right:
            return head
        left_index=left-1
        right_index=right-1
        cur=head
        res=[]
        while cur:
            res.append(cur.val)
            cur=cur.next
        res[:]=res[:left_index]+res[left_index:right][::-1]+res[right:]
        dummy=ListNode()
        cur=dummy
        for i in range(len(res)):
            p=ListNode(res[i])
            cur.next=p
            cur=p
        return dummy.next

递归反转

class Solution:
    def reverseBetween(self, head: ListNode, left: int, right: int) -> ListNode:
        def reverse_linked_list(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
        pre = dummy_node
        # 第 1 步:从虚拟头节点走 left - 1 步,来到 left 节点的前一个节点
        # 建议写在 for 循环里,语义清晰
        for _ in range(left - 1):
            pre = pre.next

        # 第 2 步:从 pre 再走 right - left + 1 步,来到 right 节点
        right_node = pre
        for _ in range(right - left + 1):
            right_node = right_node.next
        # 第 3 步:切断出一个子链表(截取链表)
        left_node = pre.next
        curr = right_node.next

        # 注意:切断链接
        pre.next = None
        right_node.next = None

        # 第 4 步:同第 206 题,反转链表的子区间
        reverse_linked_list(left_node)
        # 第 5 步:接回到原来的链表中
        pre.next = right_node
        left_node.next = curr
        return dummy_node.next



网站公告

今日签到

点亮在社区的每一天
去签到