题目链接:https://leetcode.cn/problems/reverse-nodes-in-k-group/
解题思路:先解决怎么翻转一段链表,然后在解决这道题。
翻转一个链表reverse(head,tail)
比如将链表1->2->3->4进行翻转,则翻转后的链表为:1<-2<-3<-4。
思路:从前往后遍历,依次将当前节点的next指针指向前一个节点,可以使用prev记录上一个节点
假设要翻转一段链表的头节点为head,尾节点为tail。遍历链表,在进行翻转的时候,需要记录当前节点current的前驱prev,因为翻转的链表head之前和tail之后还可能有节点,翻转后原来的tail会成为新的头节点,head会成为新的尾节点,即head.next需要连接原来的tail.next,所以初始时,可以令prev=tail.next
在遍历的时候只要前驱prev不等于尾节点tail,就循环翻转:
首先记录下一个节点next=current.next
令当前节点的next指向前驱prev,current.next=prev
更新prev=current
遍历下一个节点,current=current.next
遍历结束后,当前链表已经成功翻转,并且head成为尾节点,tail成为头节
K个一组进行翻转
可以在头节点前新建一个哑元节点newHead,令newHead.next=head,这样,头节点就不需要额外处理判断
k个一组进行翻转时,需要将这k个反转后的链表重新和前后节点连接上,因此,需要记录开始翻转的节点的前驱prev,初始时prev=newHead
循环遍历,直到head==null(遍历到最后一个节点)
head为要翻转的链表的第一个节点,tail为要翻转的链表的最后一个节点
如果链表长度小于k,不需要翻转,直接返回newHead.next
记录下一次需要翻转节点的头节点,next=tail.next
使用方法一中的步骤,翻转head和tail之间的链表,翻转后tial为新的头节点,head为新的尾节点
将翻转后的链表和前面的节点连接上,即prev.next=tail
将翻转后的链表和后面的节点连接上,即head.next=next
更新前驱prev=head(上一次翻转后链表的尾节点)
更新下一次要翻转链表的头指针,head=next
AC代码: