简介
题目链接 Leetcode 25. Reverse Nodes in k-Group
翻转LinkedList,以每K个节点为一组翻转,不够K的节点的话就保持不变。
作为链表的难度天花板,这道题依然不是很难。建议看解法之前先练习本题的简单版本LeetCode 206. Reverse Linked List。
注意:文章中一切注解皆为Python代码
理解题目
题目非常简单。给定一个链表,每K的节点翻转一次,最后一段不足K个节点就保持不变。这题有两个难点:
- 如何做到每K个节点翻转一次
- 如何处理边界情况,如开头段,结尾段
一旦解决这两个问题,这个题目就是一个Easy题。
做过LeetCode 206的人可能是用while
循环实现的翻转,如果把while
循环换成K
次的for
循环,再返回相应的起点,终点和下一个未访问节点,就可以实现每K
个节点一次的循环,并且获得操作剩余链表最重要的信息。第一个问题也迎刃而解。
再看第二个问题。我们可以把开头和结尾段分开讨论。
假设一个链表再反转的过程中会有三段,开头段(最终会返回这段的开头),中间段,结尾段(有可能不被翻转)。在这种假设下,开头段和中间段的唯一区别就在于,我们需要返回开头段的首节点;因此,我们把开头段单独拿出来翻转,最终返回的时候提取这段的首节点就好。
结尾段的处理稍微复杂,但也不难。我们算出链表的总长(设为n
),再看n % k == 0
是否成立,如果成立则结尾段与中间段没有任何区别;如果不成立我们总共可以翻转的节点数为n - n%k
个(因为最后一段太短不可以翻转)。
一种特殊情况是<