题解 | #链表中的节点每k个一组翻转#
链表中的节点每k个一组翻转
https://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e
2022.08.05算法第3题链表中的节点每k个一组翻转
链表按照k个一组进行反转,这道题有多种解法,递归也好理解,但是代码可能不太好写。
本文采用调用反转链表函数,分区段进行反转,也能达到相应的目的。
首先,需要创建反转链表的子函数,用于主函数中进行调用
ListNode* reverse(ListNode* head) { ListNode* pre=NULL; ListNode* cur=head; ListNode* temp=NULL; while(cur!=NULL) { temp=cur->next; cur->next=pre; pre=cur; cur=temp; } return pre; }然后创建初始值,pre,start,end,temp;
第一次循环pre指向dummy
start指向组内的起始位置,end指向起始位置,
采用for循环将end指向组内的最后一个节点,并且判断当前组是否满足K个数据的要求。
for(int i=1;i<k&&end!=NULL;i++) end=end->next; if(end==NULL) break;经过循环此时start指向组内首个节点,end指向组内最后一个节点;
此时需要将end后的节点保存起来,temp(next)指向end后一个节点。
注意此时需要将end指向节点的next赋值为NULL,确保调用函数正确执行。
同时需要保存反转之后的头尾节点,
end=start; start=reverse(start);
反转之后start指向原来的尾节点,end指向原来的头节点(此处start和end写反了)
之后将结点的指向修改正确,
end->next=temp; pre->next=start;之后更新各个变量的指向,此时要从前往后更新
pre=end; start=temp; end=start;
之后进行循环,直到end为NULL