Back to Blog

链表逆序

#null#list#测试#qq

设 链表 节点为

[cpp]  view plain copy

  1. typedef struct tagListNode{  
  2.     int data;  
  3.     struct tagListNode* next;  
  4. }ListNode, *List;  

要求将一带链表头List head的单向链表逆序。

分析:

  1). 若链表为空或只有一个元素,则直接返回;

  2). 设置两个前后相邻的 指针 p,q. 将p所指向的节点作为q指向节点的后继;

  3). 重复2),直到q为空

  4). 调整链表头和链表尾

示例:以逆序A->B->C->D为例,图示如下

实现及测试 代码 如下:

[cpp:nogutter]  view plain copy

  1. #include <stdio.h>  

  2. #include <stdlib.h>  

  3. typedef struct tagListNode{  

  4.     int data;  

  5.     struct tagListNode* next;  

  6. }ListNode, *List;  

  7. void PrintList(List head);  

  8. List ReverseList(List head);  

  9. int main()  

  10. {  

  11.     //分配链表头结点  

  12.     ListNode *head;  

  13.     head = (ListNode*)malloc(sizeof(ListNode));  

  14.     head->next = NULL;  

  15.     head->data = -1;  

  16.     //将[1,10]加入链表  

  17.     int i;  

  18.     ListNode *p, *q;  

  19.     p = head;  

  20.     for(int i = 1; i <= 10; i++)  

  21.     {  

  22.         q = (ListNode *)malloc(sizeof(ListNode));  

  23.         q->data = i;  

  24.         q->next = NULL;  

  25.         p->next = q;  

  26.         p = q;          

  27.     }  

  28.     PrintList(head);           /*输出原始链表*/  

  29.     head = ReverseList(head);  /*逆序链表*/  

  30.     PrintList(head);           /*输出逆序后的链表*/  

  31.     return 0;  

  32. }  

  33. List ReverseList(List head)  

  34. {  

  35.     if(head->next == NULL || head->next->next == NULL)    

  36.     {  

  37.        return head;   /*链表为空或只有一个元素则直接返回*/  

  38.     }  

  39.     ListNode *t = NULL,  

  40.              *p = head->next,  

  41.              *q = head->next->next;  

  42.     while(q != NULL)  

  43.     {          

  44.       t = q->next;  

  45.       q->next = p;  

  46.       p = q;  

  47.       q = t;  

  48.     }  

  49.     /*此时q指向原始链表最后一个元素,也是逆转后的链表的表头元素*/  

  50.     head->next->next = NULL;  /*设置链表尾*/  

  51.     head->next = p;           /*调整链表头*/  

  52.     return head;  

  53. }  

  54. void PrintList(List head)  

  55. {  

  56.     ListNode* p = head->next;  

  57.     while(p != NULL)  

  58.     {  

  59.         printf("%d ", p->data);  

  60.         p = p->next;  

  61.     }  

  62.     printf("/n");  

  63. }