门户网站建设的平台关于手机的软文营销
给你链表的头节点 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;}