一、(非递归实现)
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 }