三部曲,我们只关心一次递归做了什么
1.递归终止条件:判断是否有至少k个节点,如果没有就返回.
2.这一级递归要做什么:反转这一级递归的k个节点
3.这一级递归的返回值:将反转后的链表返回.
不用纠结递归是怎么传递的,只需知道递归返回是从最底层返回的,即终止条件那返回.
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
if k<2:
return head
node=head
#返回head,如果没有至少k个节点
for i in range(k):
if node is None:
return head
node=node.next
#现在node是第二组的头部了
prev=self.reverseKGroup(node,k)
#从head开始,这一级初始递归的形态head->temp->...->prev
#一次转换后的形态(temp->...->head->prev),此时temp变为head,head变为prev
for i in range(k):
temp=head.next
head.next=prev
prev=head
head=temp
#k此转换后,应该返回prev
return prev