当前位置:   article > 正文

k个一组翻转链表(力扣题目 C语言解法)_每k个一组翻转链表 c语言

每k个一组翻转链表 c语言

目录

图示:

 代码:


给你一个链表,每 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例 1:

输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]

示例 2:

输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]

示例 3:

输入:head = [1,2,3,4,5], k = 1
输出:[1,2,3,4,5]

示例 4:

输入:head = [1], k = 1
输出:[1]

 以上是力扣上的一道K个一组翻转单链表的题目。我的解题思路如下:

第一步:算出链表有几个节点,用总节点个数除以k,算出一共要翻转几组。

第二步:把链表每k个一组进行翻转,然后把翻转后的单独的一组拆下来依次尾插到给定的(自己定义的)头节点之后。

第三步:把没有翻转的最后一部分链接在最后。

图示:

初始时的链表:

第一次翻转拼接后:

第二次翻转拼接后:

第三次拼接:

 代码:

  1. struct ListNode* reverseKGroup(struct ListNode* head, int k){
  2. int x=k;
  3. int count=0;//算出链表有多少个节点
  4. struct ListNode s;//给出一个头节点,方便进行插入
  5. struct ListNode* cur=&s;//指向给出的头节点
  6. struct ListNode* slow=head;
  7. struct ListNode* fast=NULL;
  8. struct ListNode* prev=NULL;
  9. while(slow){
  10. count++;
  11. slow=slow->next;
  12. }
  13. slow=head;
  14. count/=k;//算出到底要进行几次翻转
  15. for(int i=0;i<count;i++){
  16. while(x){//进行翻转
  17. fast=slow->next;
  18. slow->next=prev;
  19. prev=slow;
  20. slow=fast;
  21. x--;
  22. }
  23. cur->next=prev;
  24. while(cur->next){//cur向前走,为下一次拼接做准备
  25. cur=cur->next;
  26. }
  27. prev=NULL;//必须置空,保证下一次cur向前走不会死循环
  28. x=k;
  29. }
  30. cur->next=slow;//最后链接没有被翻转的部分
  31. return s.next;
  32. }

 注意:先要了解逆置链表的方法,然后这道题目就容易了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/87026
推荐阅读
相关标签
  

闽ICP备14008679号