链表中的节点每k个一组翻转-牛客
思路
- 递归+双指针
1、递归函数的入参和返回值:入参:头结点和数字k,返回值:每组翻转后的头结点
2、终止条件:当进行到最后一个分组,即不足k次遍历到链表尾(0次也算),就将剩余的部分直接返回。
3、本层任务: 对于每个子问题,先遍历k次,找到该组结尾在哪里,然后从这一组开头遍历到结尾,依次翻转,结尾就可以作为下一个分组的开头,而先前指向开头的元素已经跑到了这一分组的最后,可以用它来连接它后面的子问题。
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param head ListNode类
# @param k int整型
# @return ListNode类
#
class Solution:
def reverseKGroup(self , head: ListNode, k: int) -> ListNode:
# 递归+双指针
#当前的头是翻转后的尾
tail=head
#遍历K次找到尾部
for i in range(0,k):
#若不足k次就到了链表尾部,直接返回,不翻转
if tail == None:
return head
tail=tail.next
#翻转需要前序和当前结点
pre=None
cur=head
while cur != tail:
tmp=cur.next
cur.next=pre
pre=cur
cur=tmp
#本组的尾巴指向下一段要翻转的链表
head.next=self.reverseKGroup(tail, k)
return pre