文章目录
- 1、题目描述
- 2、思路
1、题目描述
反转链表二。
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
2、思路
参考官方题解,基本思路是:首先将需要逆转的链表段切出来,然后反转,之后在接回去即可。(代码细节比较多,需要自己写才行)。
# 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]:
# 反转链表函数
def reverse_link_node(head):
cur = head
pre = None # 初始为空节点
while cur:
tmp = cur.next # 先存储cur的下一个节点
cur.next = pre # 指向空
pre = cur # pre往前移动
cur = tmp # cur往后移动
return pre
# 往前创建一个节点,是因为当链表只有一个节点时,切left时候会报错!
preNode = ListNode(0)
preNode.next = head
pre = preNode
# 找到左节点位置, pre用于后续还原
for i in range(0, left-1):
pre = pre.next
right_node = pre.next
# 继续往前走right步,得到右节点;
for i in range(left-1, right-1): # 这里读者不清楚遍历几次,可以直接return debug下!!
right_node = right_node.next
# 记得保存下后续节点, 后面用于还原
last = right_node.next
left_node = pre.next
# 切下
pre.next = None
right_node.next = None
# 还原
reverse_link_node(left_node)
pre.next = right_node
left_node.next = last
return preNode.next # 记住,这里返回的是哨兵节点next,不是pre.next或者head!