当前位置:   article > 正文

链表中节点每k 个一组翻转_c 语言编程 给你一个链表,每k个节点一组进行翻转 csdn

c 语言编程 给你一个链表,每k个节点一组进行翻转 csdn

题目:

将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表
如果链表中的节点数不是k 的倍数,将最后剩下的节点保持原样
你不能更改节点中的值,只能更改节点本身。
要求空间复杂度 O(1)

例如:

给定的链表是1→2→3→4→5

对于 k=2, 你应该返回 2→1→4→3→5

对于 k=3, 你应该返回 3→2→1→4→5

 

思路分析:

链表需要每k个就翻转一次,那需要用到两个函数进行两次操作:

  • 一个是用来对链表进行分段,并确定最后一次是否满足k个节点;
  • 一个是用来最小段链表进行翻转,并将新的小段链表头返回;

两个操作可以分别用两个函数封装,也可以放到一个函数中。

 

方法一:可以先统计链表的长度,然后根据长度进行分段,再调用翻转的功能

方法二:通过递归的方法,head记录小段的头,cur记录下一个小段的起点,或是结束点的下一个节点。

 

因为翻转的函数都一样的,这里只提供方法二的代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct node
  4. {
  5. int value;
  6. struct node* next;
  7. } list_node;
  8. list_node* reverse(list_node* head, list_node* tail)
  9. {
  10. list_node* pre = NULL;
  11. list_node* next = NULL;
  12. while (head != tail) {
  13. next = head->next;
  14. head->next = pre;
  15. pre = head;
  16. head = next;
  17. }
  18. return pre;
  19. }
  20. list_node* reverse_k_group(list_node* head, int k)
  21. {
  22. list_node* cur = head;
  23. list_node* new_head = NULL;
  24. for (int i = 0; i < k; ++i) {
  25. if (!cur) {
  26. return head;
  27. }
  28. cur = cur->next;
  29. }
  30. new_head = reverse(head, cur);
  31. head->next = reverse_k_group(cur, k);
  32. return new_head;
  33. }
  34. void print(list_node* head, int k)
  35. {
  36. list_node* cur = head;
  37. while (cur) {
  38. if (cur != head) {
  39. printf("->");
  40. } else {
  41. printf("k = %d: ", k);
  42. }
  43. printf("%d", cur->value);
  44. cur = cur->next;
  45. }
  46. printf("\n");
  47. }
  48. void test10()
  49. {
  50. list_node* head = NULL;
  51. list_node* cur = NULL;
  52. for (int i = 0; i < 5; ++i) {
  53. list_node* node = (list_node*)malloc(sizeof(list_node));
  54. node->value = i + 1;
  55. node->next = NULL;
  56. if (!head) {
  57. head = node;
  58. }
  59. if (!cur) {
  60. cur = node;
  61. }
  62. else {
  63. cur->next = node;
  64. cur = node;
  65. }
  66. }
  67. print(head, 1);
  68. head = reverse_k_group(head, 2);
  69. print(head, 2);
  70. }

 

运行结果:

 

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

闽ICP备14008679号