写在前面
前段时间因为一些原因刷题刷的很不规律,且在刷题过程中发现自己之前学的数据结构与算法知识还不够扎实,所以开始学习《labuladong的算法小抄》这本书,并记录自己的刷题过程,以巩固知识。
题目要求
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
示例 1:
输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]
示例 2:
输入:head = [5], left = 1, right = 1
输出:[5]
解题思路
- 从简单情况开始考虑
1.反转整个字符串
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
def reverse(head: ListNode) -> ListNode:
if head.next==None: #Base case,递归到最底层的情况
return head
last=reverse(head.next) #开始递归
head.next.next=head #head.next->head
head.next=None #head.next->head->None
return last
2.反转前N个节点
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
successor=None #因为只反转前N个,所以需要一个后继指针
def reverseN(head: ListNode,N: int) -> ListNode:
if N==1: #Base case,递归到最底层的情况
successor=head.next #后继节点为下一个不需反转的节点
return head
last=reverseN(head.next,N-1) #开始递归
head.next.next=head #head.next->head
head.next=successor #head.next->head->successor
return last
3.反转部分链表
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
successor=None #因为只反转前N个,所以需要一个后继指针
def reverseN(head: ListNode,N: int) -> ListNode:
if N==1: #Base case,递归到最底层的情况
successor=head.next #后继节点为下一个不需反转的节点
return head
last=reverseN(head.next,N-1) #开始递归
head.next.next=head #head.next->head
head.next=successor #head.next->head->successor
return last
def reverseBetween(head: ListNode,left: int, right: int) -> ListNode:
if left==1: #Base case,当left==1时,为特殊情况反转前N个节点
return reverseN(head,right)
head.next=reversrBetween(head.next,left-1,right-1) #类似于for循环遍历到反转开始的那个节点
return head