解题思路(头插法)
看到链表题第一反应就是画草稿
将链表分为两个区域: 链表头部和待反转区,因为这个解法是更改待反转区的指向,所以待反转区到链表尾部的这些节点不用去管。
-
首先我们需要三个指针
pre
、cur
、nxt
-
为了不更改原链表
head
,还需要一个哑节点dummy
pre
永远指向待反转区域第一个节点left
的前一个节点cur
指向待反转区的第一个节点left
nxt
永远指向待反转区第一个节点cur
的下一个节点- 接下来我们在循环遍历的时候,
cur
会不断的变化,nxt
也会跟着变化
-
接下来是头插法的步骤
- 把
cur
的下一个节点指向nxt
的下一个节点 - 把
nxt
的下一个节点指向pre
的下一个节点 - 把
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