给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例:
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明:
你的算法只能使用常数的额外空间。 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
对于翻转数组类问题,除了遍历指针方法外,堆栈结构是一个不错的选择。
1、k个一组把节点放到堆栈中去
2、逐个pop堆栈中的节点
3、处理堆栈中剩余的节点
class Solution: def reverseKGroup(self, head: ListNode, k: int) -> ListNode: stack = [] final = ListNode(0) hair = final # 遍历整个链表 while head: # k个一组将链表中的节点入栈 # 当不满k个节点时,循环结束,堆栈中是剩余的节点 if len(stack) < k: stack.append(head) head = head.next # k个节点进行翻转操作 else: while stack: hair.next = stack[-1] hair = hair.next stack.pop(-1) # 如果堆栈中有链表中剩余不足k个节点 # 分两种情况进行处理 # 不足k个,不进行翻转操作 # 大于等于k个,进行翻转操作 输入 [1,2] 2, while下的else是不执行的, # 此时stack的长度是等于k的,所以也需要考虑大于等于k的情况。 if len(stack) < k: while stack: hair.next = stack[0] hair = hair.next stack.pop(0) else: while stack: hair.next = stack[-1] hair = hair.next stack.pop(-1) hair.next = None return final.next来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group