self.stack = [] p = ListNode(-1) result = p # 状态标志 flag = True temp_head = head while head: for i inrange(k): ifnot head: flag = False break self.stack.append(head) head = head.next ifnot flag: break else: # 更新翻转后的进行连接的节点 temp_head = head for i inrange(k): cur = self.stack.pop() p.next = cur p = cur # 翻转后和后面的节点相连 p.next = temp_head return result.next
classSolution: defreverseKGroup(self, head: ListNode, k: int) -> ListNode: # 定义一个哨兵节点 sentry = ListNode(0) pre = sentry start = head flag = True while head: for i inrange(k): ifnot head: # 剩余节点数量小于k,跳出 flag = False break head = head.next ifnot flag: break # 上次翻转后的节点连接这次翻转后的节点 pre.next = self.reverse(start,head) # 连接这次翻转以后的正常节点 start.next = head # 更新位置 pre = start # 更新位置 start = head return sentry.next
defreverse(self,start,end): pre, cur, nexts = None, start, start # 三个指针进行局部翻转 while cur != end: nexts = nexts.next # 箭头反指 cur.next = pre # 更新pre位置 pre = cur # 更新cur位置 cur = nexts return pre