92. 反转链表 II
原始题目链接:https://leetcode-cn.com/problems/reverse-linked-list-ii/
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
解题思路:
反转单链表,单链表只有指向后继节点的next指针,所以反转的时候需要知道要反转的节点和其前驱节点。这道题是反转指定部分的节点,所以需要四个指针,分别是要反转部分的起始(left,right)节点,以及left的前一个节点,right的后一个节点。知道这些节点位置是为了修改next指针的指向,链表的题目最好画图,边画图边写代码很好理解。
代码实现:
# 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:
# 如果left和right相同,则没有翻转的节点,直接返回head
if left == right:
return head
# 申请一个节点,初始值一般设置为-1
dummy = ListNode(-1)
# 让新申请的节点的next指针,指向链表的头结点
dummy.next = head
# 额外申请两个节点,初始值赋值为dummy,用于查找left的前一个节点和right节点的位置
left_pre_node, right_node = dummy, dummy
# 查找left前一个节点的位置
for _ in range(left - 1):
left_pre_node = left_pre_node.next
# 查找right节点的位置
for _ in range(right):
right_node = right_node.next
# left节点
left_node = left_pre_node.next
# right节点的下一个节点
right_next_node = right_node.next
# 反转链表需要知道当前要反转的节点和反转节点的前一个节点
# 当前要反转的节点,就是left位置的下一个节点
cur = left_node.next
# 当前要反转的节点的前一个节点,就是left位置的节点
pre = left_node
# 节点的位置都找到后,开始反转节点
while cur != right_next_node:
temp = cur.next
cur.next = pre
pre = cur
cur = temp
# 更改left前一个节点的next指针指向,反转后应该指向原来的right节点
left_pre_node.next = right_node
# 更改left的next指针的指向,反转后应该指向right的下一个节点
left_node.next = right_next_node
# 返回dummy的next指针指向的头结点即可
return dummy.next
参考文献:
https://leetcode-cn.com/problems/reverse-linked-list-ii/solution/shuang-zhi-zhen-xu-ni-tou-jie-dian-python3-9420-fa/