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

    一、(非递归实现)

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

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

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 typedef struct _DLinkList
     5 {
     6     int data;
     7     struct _DLinkList *prev;
     8     struct _DLinkList *next;
     9 
    10 }DLinkList;
    11 
    12 DLinkList *CreateDLinkList(DLinkList *pHead, int array[], int n)
    13 {
    14     DLinkList *p = pHead;
    15     for(int i = 0; i < n; i++)
    16     {
    17         DLinkList *q = (DLinkList *)malloc(sizeof(DLinkList));
    18         if(q == NULL)
    19         {
    20             printf("malloc Failed!\n");
    21             return NULL;
    22         }
    23         q->data = array[i];
    24         p->next = q;
    25         q->prev = p;
    26         p = q;
    27     }
    28 
    29     p->next = NULL;
    30     p = pHead;
    31     pHead = pHead->next;
    32     if(pHead != NULL)
    33         pHead->prev = NULL;
    34     free(p);
    35 
    36     return pHead;
    37 }
    38 
    39 DLinkList *ReverseDLinkList(DLinkList *pCur, DLinkList *pPre, DLinkList *pNext)
    40 {
    41     if(pNext == NULL)
    42         return pCur;
    43 
    44     if(pCur->prev == NULL)
    45         pCur->next = NULL;
    46 
    47     DLinkList *p = pNext->next;
    48     pNext->next = pCur;
    49     pCur->prev = pNext;
    50 
    51     if(p != NULL)
    52         return ReverseDLinkList(pNext, pCur, p);
    53     else
    54     {
    55         pNext->prev = NULL;
    56         return pNext;
    57     }
    58 }
    59 
    60 int main(int argc, char* argv[])
    61 {
    62     int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    63 
    64     DLinkList *pHead = (DLinkList *)malloc(sizeof(DLinkList));
    65     if(pHead == NULL)
    66     {
    67         printf("malloc Failed!\n");
    68         return 0;
    69     }
    70     pHead->next = NULL;
    71     pHead->prev = NULL;
    72 
    73     pHead = CreateDLinkList(pHead, array, 9);
    74     if(pHead == NULL)
    75     {
    76         printf("链表为空!\n");
    77         return 0;
    78     }
    79 
    80     pHead = ReverseDLinkList(pHead, NULL, pHead->next);
    81     if(pHead == NULL)
    82     {
    83         printf("链表为空!\n");
    84         return 0;
    85     }
    86 
    87     DLinkList *p = pHead;
    88     while(p != NULL)
    89     {
    90         printf("%d ", p->data);
    91         p = p->next;
    92     }
    93     printf("\n");
    94 
    95     return 0;
    96 }
  • 相关阅读:
    【iOS】打印方法名
    【iOS】设备系统版本
    【iOS】receiver type *** for instance message is a forward declaration
    【iOS】获取应用程序本地路径
    hash算法
    redis文档
    Couchbase
    nodejs多核处理
    基于nodejs的消息中心
    nodejs两个例子
  • 原文地址:https://www.cnblogs.com/Dreamcaihao/p/3090076.html
Copyright © 2011-2022 走看看