25.png

    1. /*
    2. 就地逆置链表
    3. 分析:
    4. 我们采用头插法进行逆置。
    5. */
    6. struct Link {
    7. int data;
    8. struct Link* next;
    9. };
    10. #define _CRT_SECURE_NO_WARNINGS
    11. #include <stdio.h>
    12. #include <stdlib.h>
    13. //void reverse(Link *h) {
    14. //struct Link *pre = h, *p = h->next, *q = h->next,*r;
    15. ////pre记录操作节点p上一个节点,q记录第一个节点,之后需要指向NULL,r用于指向每一次操作时p的后一个节点,防止断链
    16. //while (p) {//遍历操作,修改指针指向
    17. // r = p->next;
    18. // p->next = pre;
    19. // pre = p;
    20. // p = r;
    21. //}
    22. //h->next = pre;//头指针指向最后一个节点
    23. //q->next = NULL;//第一个节点指向NULL,不然就是循环单链表了
    24. //我们也可以采用头插法进行逆置,两个方法的时间复杂度均为O(N)
    25. struct Link *l = h, *p = h->next,*r;
    26. l->next = NULL;
    27. while (p) {
    28. r = p->next;
    29. p->next = l->next;
    30. l->next = p;
    31. p = r;
    32. }
    33. h = l;
    34. }
    35. int main() {
    36. struct Link *head = (struct Link*) malloc(sizeof(struct Link));
    37. Link *createLink(int);
    38. head = createLink(0);
    39. reverse(head);
    40. printf("逆置后链表值为:");
    41. while (head->next) {
    42. printf("%d ", head->next->data);
    43. head = head->next;
    44. }
    45. return 0;
    46. }