双链表反转

一、(非递归实现)

  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 }

 

 

转载于:https://www.cnblogs.com/Dreamcaihao/archive/2013/05/21/3090076.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值