Python算法题集_K 个一组翻转链表
本文为Python算法题集之一的代码示例
题25:K 个一组翻转链表
1. 示例说明
-
给你链表的头节点
head
,每k
个节点一组进行翻转,请你返回修改后的链表。k
是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k
的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
示例 1:
输入:head = [1,2,3,4,5], k = 2 输出:[2,1,4,3,5]
示例 2:
输入:head = [1,2,3,4,5], k = 3 输出:[3,2,1,4,5]
提示:
-
链表中的节点数目为
n
1 <= k <= n <= 5000
0 <= Node.val <= 1000
**进阶:**你可以设计一个只用
O(1)
额外内存空间的算法解决此问题吗?
-
2. 题目解析
- 题意分解
- 本题为对链表中的节点进行块反转
- 本题的主要计算是2块,1是链表遍历,2是节点反转
- 基本的解法是单层循环,链表读一遍,过程中执行节点反转,所以基本的时间算法复杂度为O(m)
- 优化思路
-
通常优化:减少循环层次
-
通常优化:增加分支,减少计算集
-
通常优化:采用内置算法来提升计算速度
-
分析题目特点,分析最优解
-
标准方法是一次循环,依次进行块反转
-
可以用列表结构进行节点调整,列表结构简单,方便维护
-
可以用堆栈法进行块反转
-
可以用递归法进行块反转
-
- 测量工具
- 本地化测试说明:LeetCode网站测试运行时数据波动很大,因此需要本地化测试解决这个问题
CheckFuncPerf
(本地化函数用时和内存占用测试模块)已上传到CSDN,地址:Python算法题集_检测函数用时和内存占用的模块- 本题很难超时,本地化超时测试用例自己生成,详见【最优算法章节】
3. 代码展开
1) 标准求解【依次反转】
一次遍历,依次完成块反转
性能优异,超越92%
import CheckFuncPerf as cfp
class Solution:
@staticmethod
def reverseKGroup_base(head, k):
if head is None or k < 2:
return head
tmpnode = head
for iIdx in range(k - 1):
tmpnode = tmpnode.next
if tmpnode is None:
return head
headnode = tmpnode
currnode = head
while tmpnode:
prevnode, tailnode = None, currnode
for iIdx in range