前往此题

解题思路(头插法)

看到链表题第一反应就是画草稿

将链表分为两个区域: 链表头部待反转区,因为这个解法是更改待反转区的指向,所以待反转区链表尾部的这些节点不用去管。

  1. 首先我们需要三个指针precurnxt

  2. 为了不更改原链表head,还需要一个哑节点dummy

    1. pre永远指向待反转区域第一个节点left的前一个节点
    2. cur指向待反转区的第一个节点left
    3. nxt永远指向待反转区第一个节点cur的下一个节点
    4. 接下来我们在循环遍历的时候,cur会不断的变化,nxt也会跟着变化
  3. 接下来是头插法的步骤

    1. cur的下一个节点指向nxt的下一个节点
    2. nxt的下一个节点指向pre的下一个节点
    3. pre的下一个节点指向nxt

第一次遍历结果头插法之后会是这样的效果

以此类推。。。

代码

# 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: ListNode, left: int, right: int) -> ListNode:
        dummy = ListNode(0)
        dummy.next = head
        pre = dummy

        for _ in range(left-1):
            pre = pre.next
        
        cur = pre.next

        for _ in range(left, right):
            nxt = cur.next
            cur.next = nxt.next
            nxt.next = pre.next
            pre.next = nxt
        return dummy.next