leetcode 25 k 个一组翻转列表

    技术2022-07-12  84

    题目描述

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

    Processed: 0.025, SQL: 10