class Solution:
def reverseKGroup(self , head , k ):
#方法1
'''
#1.增加新链表的头结点AHead,并令H为新链表的尾结点;
AHead=ListNode(0)
AHead.next=None
H=AHead
#2.从第一个结点开始,循环执行:
p=head
while True:
#2.1向后尝试数k个结点
q,count=p,0
while q and count<k:
count+=1
q=q.next
#2.2如果可以数够k个结点,那么就把新链表的尾结点H视为临时头结点H,
#把这k个结点以头插法插入到新链表尾部,
#并将临时头结点H移动到新链表的尾部,即更新新链表的尾结点H!
if count==k:
for i in range(k):
s=p.next
p.next=H.next
H.next=p
p=s
for i in range(k):
H=H.next
H.next=None
#2.3如果不能够数k个结点,那么表明不必再翻转了,直接把当前结点指针p加入到新链表尾部即可!
else:
H.next=p
break
return AHead.next
'''
#方法2:
#1.计算链表的长度
p,n=head,0
while p:
n+=1
p=p.next
#2.增设新链表头结点,以方便计算,并计算需要翻转的链表长度;
AHead=ListNode(0)
H,AHead.next=AHead,None
i,p,n=0,head,n-n%k
#3.从第一个结点开始,循环执行:
while i<n:
#3.1把尾结点H视为临时头结点,依次将后续k个结点,以头插法加入到新链表的尾部;
for j in range(k):
s=p.next
p.next=H.next
H.next=p
p=s
#3.2把尾结点H移动到新链表尾部,即更新新链表的尾结点H;
for j in range(k):H=H.next
H.next=None
#3.3更新下标,即开始下一组结点的翻转
i+=k
#4.把余下不可翻转的结点加入到新链表尾部
H.next=p
return AHead.next