力扣刷题——25.K个一组翻转链表
给你链表的头节点 head
,每 k
个节点一组进行翻转,请你返回修改后的链表。
k
是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k
的整数倍,那么请将最后剩余的节点保持原有顺序。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
示例 1:
输入:head = [1,2,3,4,5], k = 2 输出:[2,1,4,3,5]
要解决这道题,就要利用部分反转链表的方法,具体可以参考我的上一篇博客力扣刷题——92.反转链表||-CSDN博客,这里不再赘述,重点是如何循环地反转链表的多个部分。在反转链表的方法中,我们定义了
ListNode dummy(0,head);
listNode *p0=&dummy;
ListNode *p1=nullptr;
ListNode *p2=p0->next;
并在循环中定义了p3=p2->next;,然后在循环中让它们一直向后移动,不断改变节点指向。而在这道题中,在一次反转结束后p0还指向当前反转的部分链表的头节点,我们需要将p0移动到指向下一次反转的头节点,也即是当前部分链表的尾节点,然后重新定义p1,p2,p3再移动下一部分。
ListNode* reverseKGroup(ListNode* head, int k) {
int len=0;
ListNode dummy(0,head);
ListNode *p0=&dummy;
for(ListNode* p=head;p;p=p->next)
{
len++;
}
while(len>=k)
{
ListNode *p1=nullptr;
ListNode *p2=p0->next;
for(int i=0;i<k;i++)
{
ListNode *p3=p2->next;
p2->next=p1;
p1=p2;
p2=p3;
}
p0->next->next=p2;
p0->next=p1;
for(int j=0;j<k;j++)
{
p0=p0->next;
}
len-=k;
}
return dummy.next;
}