zoukankan      html  css  js  c++  java
  • ZT 链表逆序

     

    链表逆序 原帖地址http://blog.csdn.net/niuer09/article/details/5961004

    分类: C/C++ 18425人阅读 评论(22) 收藏 举报

    设链表节点为

    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为例,图示如下

    实现及测试代码如下:

    1. #include <stdio.h>  
    2. #include <stdlib.h>  
    3.   
    4. typedef struct tagListNode{  
    5.     int data;  
    6.     struct tagListNode* next;  
    7. }ListNode, *List;  
    8.   
    9. void PrintList(List head);  
    10. List ReverseList(List head);  
    11.   
    12. int main()  
    13. {  
    14.     //分配链表头结点  
    15.     ListNode *head;  
    16.     head = (ListNode*)malloc(sizeof(ListNode));  
    17.     head->next = NULL;  
    18.     head->data = -1;  
    19.   
    20.     //将[1,10]加入链表  
    21.     int i;  
    22.     ListNode *p, *q;  
    23.     p = head;  
    24.     for(int i = 1; i <= 10; i++)  
    25.     {  
    26.         q = (ListNode *)malloc(sizeof(ListNode));  
    27.         q->data = i;  
    28.         q->next = NULL;  
    29.         p->next = q;  
    30.         p = q;          
    31.     }  
    32.   
    33.     PrintList(head);           /*输出原始链表*/  
    34.     head = ReverseList(head);  /*逆序链表*/  
    35.     PrintList(head);           /*输出逆序后的链表*/  
    36.     return 0;  
    37. }  
    38.   
    39. List ReverseList(List head)  
    40. {  
    41.     if(head->next == NULL || head->next->next == NULL)    
    42.     {  
    43.        return head;   /*链表为空或只有一个元素则直接返回*/  
    44.     }  
    45.   
    46.     ListNode *t = NULL,  
    47.              *p = head->next,  
    48.              *q = head->next->next;  
    49.     while(q != NULL)  
    50.     {          
    51.       t = q->next;  
    52.       q->next = p;  
    53.       p = q;  
    54.       q = t;  
    55.     }  
    56.   
    57.     /*此时q指向原始链表最后一个元素,也是逆转后的链表的表头元素*/  
    58.     head->next->next = NULL;  /*设置链表尾*/  
    59.     head->next = p;           /*调整链表头*/  
    60.     return head;  
    61. }  
    62.   
    63. void PrintList(List head)  
    64. {  
    65.     ListNode* p = head->next;  
    66.     while(p != NULL)  
    67.     {  
    68.         printf("%d ", p->data);  
    69.         p = p->next;  
    70.     }  
    71.     printf("/n");  
    72. }  
  • 相关阅读:
    SED&AWK
    load average[zhuan]
    To be learned
    Android计时器 android.widget.Chronometer
    Play初识
    获取视图的宽高
    自定义摄像机
    Android VideoView使用小记
    在android中,如何去掉webview读取网页后点击网页上的按钮出现的方框
    阿里云主机试用之自建站点和ftp上传所遇的2个问题
  • 原文地址:https://www.cnblogs.com/jeanschen/p/3538966.html
Copyright © 2011-2022 走看看