25。一组K个反向链表来源:https://leetcode-cn.com/problems/reverse-nodes-in-k-group题目给你一个链表,每组k个节点翻转,请返回翻转后的链表。k是一个正整数,其值小于或等于链表的长度。如果节点总数不是k的整数倍,请保持最后剩下的节点按原顺序排列。例子:给你这个链表:1->2->3->4->5当k=2时,它应该返回:2->1->4->3->5当k=3时,它应该返回:3->2->1->4->5解释:你的算法只能使用恒定数量的额外空间。您不能只更改节点内的值,但您需要实际交换节点。解题思路:链表迭代翻转具体思路:首先保证翻转的范围,由题目中提到的k控制;关于链表的翻转,注意前驱和后继的问题,防止指向错误,这里也是为了将翻转后的链表与后续联系起来;定义pre和tail,pre表示要翻转的链表部分的前导,tail表示尾;上面的tail由k控制到达终点;翻转链表并将翻转的部分与后续部分拼接;注:根据题意,当翻转部分的长度小于k时,此时不做处理。具体代码实现如下。代码实现#单向链表的定义。#classListNode:#def__init__(self,x):#self.val=x#self.next=Noneclass解决方案:defreverseKGroup(self,head:ListNode,k:int)->ListNode:ifhead==Noneandhead.next==Noneandk<2:returnhead#定义哨兵节点dummy=ListNode(0)#指向节点dummy.next=head#定义前驱和后继节点pre=dummytail=dummy#控制tail到链表要翻转部分的末尾whileTrue:count=kwhilecount>0andtail!=None:count-=1tail=tail.next#到达尾部时,当长度小于k时,跳出循环iftail==None:break#这个用于下一次循环head=pre.next#开始翻转whilepre.next!=tail:tmp=pre.nextpre.next=tmp.nexttmp.next=tail.next尾巴。next=tmp#重置指针pre=headtail=headreturndummy.next实现结果上面是使用迭代,根据题目提供的k值确定翻转列表的部分,内部实现翻转,然后求解主要内容《25. K 个一组翻转链表》注意链表的前驱和后继都要定义,防止指向错误。
