zoukankan      html  css  js  c++  java
  • 单链表反转

    一、单链表反转(非递归实现)

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 typedef struct _LinkList
     5 {
     6     int data;
     7     struct _LinkList *pnext;
     8 
     9 }LinkList;
    10 
    11 
    12 LinkList *CreateList(LinkList *pHead, int array[], int n)
    13 {
    14     LinkList *q = pHead;
    15     for(int i = 0; i < n; i++)
    16     {
    17         LinkList *p = (LinkList *)malloc(sizeof(LinkList));
    18         p->pnext = NULL;
    19         p->data = array[i];
    20 
    21         if(pHead->pnext == NULL)
    22         {
    23             pHead->pnext = p;
    24             q = p;
    25         }
    26         else
    27         {
    28             q->pnext = p;
    29             q = p;
    30         }
    31     }
    32 
    33     q = pHead;
    34     pHead = pHead->pnext;
    35     free(q);
    36 
    37     return pHead;
    38 }
    39 
    40 LinkList *ReverseList(LinkList *pHead)
    41 {
    42     if(pHead == NULL || pHead->pnext == NULL)
    43         return pHead;
    44 
    45     if(pHead->pnext->pnext == NULL)
    46     {
    47         LinkList *p = pHead->pnext;
    48         pHead->pnext = NULL;
    49         p->pnext = pHead;
    50         return p;
    51     }
    52 
    53     LinkList *p = pHead;
    54     LinkList *q = p->pnext;
    55     LinkList *r = q->pnext;
    56 
    57     while(r != NULL)
    58     {
    59         q->pnext = p;
    60         p = q;
    61         q = r;
    62         r = r->pnext;
    63     }
    64 
    65     q->pnext = p;
    66     pHead->pnext = NULL;
    67     pHead = q;
    68 
    69     return pHead;
    70 }
    71 
    72 int main()
    73 {
    74     int array[] = {1, 2, 3, 4, 5, 6, 7, 8,9};
    75 
    76     LinkList *pHead = (LinkList *)malloc(sizeof(LinkList));
    77     if(pHead == NULL)
    78     {
    79         printf("动态开辟空间失败!");
    80         return 0;
    81     }
    82 
    83     pHead->pnext = NULL;
    84     pHead = CreateList(pHead, array, 3);
    85 
    86     pHead = ReverseList(pHead);
    87 
    88     LinkList *p = pHead;
    89 
    90     while(p != NULL)
    91     {
    92         printf("%d ", p->data);
    93         p = p->pnext;
    94     }
    95     if(pHead != NULL)
    96         printf("\n");
    97 
    98     return 0;
    99 }

     二、单链表反转(递归实现)

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 typedef struct _LinkList
     5 {
     6     int data;
     7     struct _LinkList *pnext;
     8 
     9 }LinkList;
    10 
    11 
    12 LinkList *CreateList(LinkList *pHead, int array[], int n)
    13 {
    14     LinkList *q = pHead;
    15     for(int i = 0; i < n; i++)
    16     {
    17         LinkList *p = (LinkList *)malloc(sizeof(LinkList));
    18         p->pnext = NULL;
    19         p->data = array[i];
    20 
    21         if(pHead->pnext == NULL)
    22         {
    23             pHead->pnext = p;
    24             q = p;
    25         }
    26         else
    27         {
    28             q->pnext = p;
    29             q = p;
    30         }
    31     }
    32 
    33     q = pHead;
    34     pHead = pHead->pnext;
    35     free(q);
    36 
    37     return pHead;
    38 }
    39 
    40 LinkList *ReverseList(LinkList *pHead, LinkList *pre)
    41 {
    42     if(pHead == NULL)
    43         return pHead;
    44 
    45     LinkList *p = pHead->pnext;
    46     pHead->pnext = pre;
    47 
    48     if(p != NULL)
    49         return ReverseList(p, pHead);
    50     else
    51         return pHead;
    52 }
    53 
    54 int main()
    55 {
    56     int array[] = {1, 2, 3, 4, 5, 6, 7, 8,9};
    57 
    58     LinkList *pHead = (LinkList *)malloc(sizeof(LinkList));
    59     if(pHead == NULL)
    60     {
    61         printf("动态开辟空间失败!");
    62         return 0;
    63     }
    64 
    65     pHead->pnext = NULL;
    66     pHead = CreateList(pHead, array, 9);
    67 
    68     pHead = ReverseList(pHead, NULL);
    69 
    70     LinkList *p = pHead;
    71 
    72     while(p != NULL)
    73     {
    74         printf("%d ", p->data);
    75         p = p->pnext;
    76     }
    77     if(pHead != NULL)
    78         printf("\n");
    79 
    80     return 0;
    81 }
  • 相关阅读:
    礼物的最大价值
    复杂链表的复制
    全排列(回溯法)
    删除排序数组中的重复项
    三角形最小路径和(经典dp)
    链表中倒数第k个节点
    造成segment fault,产生core dump的可能原因
    wmpnetwk.exe怎么禁启动
    GSM/GPRS/EDGE/WCDMA/HSDPA/HSUPA--辨析
    OSI七层参考模型每一层都有哪些协议
  • 原文地址:https://www.cnblogs.com/Dreamcaihao/p/3087789.html
Copyright © 2011-2022 走看看