题目描述
给你一个链表,每 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