当前位置:   article > 正文

单链表的反转 - O(n)时间复杂度的非递归实现

单链表反转时间复杂度

  其实这个才是逆序输出链表的正确操作,记得前面写的时候有四种办法,但除了递归比较简洁而且时间复杂度和空间复杂度都满足外,其他的方法都太丑陋了...

  Code:

  1. /* 反转链表的函数 */
  2. struct reverseList * reverseLinkList(struct reverseList * node)
  3. {
  4. struct reverseList * prev, * rear;
  5. rear = node -> next;
  6. while(rear -> next != NULL) //整体并未向后移动
  7. {
  8. prev = rear -> next; //先用一个容器指针来复制一份该指针
  9. rear -> next = prev -> next; //把被复制的指针后面的一位赋给被复制的指针,意味着告诉被复制的指针的前一个指针,它的下一个是被复制指针的后一个。
  10. prev -> next = node -> next; //把第一个指针赋给被复制指针的后一个,意味着告诉被复制的指针,它的下一个为第一个
  11. node -> next = prev; //把复制的指针赋给第一个,意味着告诉头,它的下一个为复制指针
  12. }
  13. return node;
  14. }

  我推荐可以看看我参考别人的图文解释的文章:点击(ง •_•)ง

  完整的代码测试:

  1. /*
  2. * 反转单链表 - 非递归实现
  3. */
  4. #include<stdio.h>
  5. #include<stdlib.h>
  6. struct reverseList {
  7. struct reverseList * next;
  8. int val;
  9. };
  10. struct reverseList * CreateList(void)
  11. {
  12. struct reverseList * head, * s, * current;
  13. int i;
  14. head = (struct reverseList *)malloc(sizeof(struct reverseList));
  15. s = head;
  16. for(i = 0; i < 10; i++)
  17. {
  18. current = (struct reverseList *)malloc(sizeof(struct reverseList));
  19. current -> val = i + 1;
  20. s -> next = current;
  21. s = s -> next;
  22. }
  23. s -> next = NULL;
  24. return head;
  25. }
  26. struct reverseList * reverse_Link_List(struct reverseList * node)
  27. {
  28. struct reverseList * prev, * rear;
  29. rear = node -> next;
  30. while(rear -> next != NULL)
  31. {
  32. prev = rear -> next;
  33. rear -> next = prev -> next;
  34. prev -> next = node -> next;
  35. node -> next = prev;
  36. }
  37. return node;
  38. }
  39. int main(void)
  40. {
  41. struct reverseList * head, * p;
  42. head = CreateList();
  43. p = head -> next;
  44. while(p)
  45. {
  46. printf("%d ", p -> val);
  47. p = p -> next;
  48. }
  49. printf("\n");
  50. p = reverse_Link_List(head) -> next;
  51. while(p)
  52. {
  53. printf("%d ", p -> val);
  54. p = p -> next;
  55. }
  56. printf("\n");
  57. p = head;
  58. while(p)
  59. {
  60. head = p;
  61. p = p -> next;
  62. free(head);
  63. }
  64. p = NULL;
  65. return 0;
  66. }

 

转载于:https://www.cnblogs.com/darkchii/p/7597050.html

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

闽ICP备14008679号