# 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:
# write code here
result_list_head_flag = ListNode(-1)
result_list_head_flag.next = head
# 第一个节点没有上一个节点,所以初始化为空。
previous = None
current = head
# 现在还没有上一个子列表,用结果列表头的标记指针来占用这个位置,可以让这个头标记可以在处理过程中连接上结果列表的头节点。
previous_sublist_tail = result_list_head_flag
# 当前子列表的尾巴就是当前访问到的节点。
current_sublist_tail = current
count = 0
while current:
print(current.val)
count += 1
if count == 1:
# 如果是新开子列表的第一个节点,复制当前节点。
copy_current = ListNode(current.val)
# 把这个节点标记为当前子列表的尾巴。
current_sublist_tail = copy_current
# 把这个复制节点标记为上一个节点,并进行下一步访问。
previous = copy_current
current = current.next
elif count == k:
# 复制当前节点,并与上一个复制节点逆序。
copy_current = ListNode(current.val)
copy_current.next = previous
# 把当前子列表和上一个子列表的尾巴相连。
previous_sublist_tail.next = copy_current
# 把当前子列表的尾巴指向原列表中的下一个节点,保证凑不足k个元素的剩余部分能与逆序列表相连。
current_sublist_tail.next = current.next
# 当前子列表的为节点将作为下个子列表的前一个子列表的尾节点。
previous_sublist_tail = current_sublist_tail
current = current.next
count = 0
else:
# 复制当前节点,并与上一个复制节点逆序。
copy_current = ListNode(current.val)
copy_current.next = previous
# 把这个复制节点标记为上一个节点,并进行下一步访问。
previous = copy_current
current = current.next
return result_list_head_flag.next