剑指Offer24 复杂链表的复制
1 /************************************************************************* 2 > File Name: 24_ComplexListClone.cpp 3 > Author: Juntaran 4 > Mail: JuntaranMail@gmail.com 5 > Created Time: 2016年08月31日 星期三 14时24分35秒 6 ************************************************************************/ 7 8 #include <stdio.h> 9 #include <malloc.h> 10 11 // 链表结构体 12 struct ComplexListNode 13 { 14 int val; 15 ComplexListNode* next; 16 ComplexListNode* rand; 17 }; 18 19 // 构造链表 20 ComplexListNode* createList() 21 { 22 ComplexListNode* A = new ComplexListNode(); 23 ComplexListNode* B = new ComplexListNode(); 24 ComplexListNode* C = new ComplexListNode(); 25 ComplexListNode* D = new ComplexListNode(); 26 ComplexListNode* E = new ComplexListNode(); 27 A->val = 1; 28 A->next = B; 29 A->rand = C; 30 B->val = 2; 31 B->next = C; 32 B->rand = E; 33 C->val = 3; 34 C->next = D; 35 C->rand = NULL; 36 D->val = 4; 37 D->next = E; 38 D->rand = B; 39 E->val = 5; 40 E->next = NULL; 41 E->rand = NULL; 42 43 return A; 44 } 45 46 void* PrintComplexList(ComplexListNode* head) 47 { 48 while (head) 49 { 50 if (head->rand != NULL) 51 printf("%d rand=%d\n", head->val, head->rand->val); 52 else 53 printf("%d\n", head->val); 54 head = head->next; 55 } 56 printf("\n"); 57 } 58 59 // 复制链表,复制的接在原位置后面 60 void CloneNodes(ComplexListNode* head) 61 { 62 ComplexListNode* node = head; 63 while (node != NULL) 64 { 65 ComplexListNode* newNode = new ComplexListNode(); 66 newNode->val = node->val; 67 newNode->next = node->next; 68 newNode->rand = NULL; 69 node->next = newNode; 70 node = newNode->next; 71 } 72 } 73 74 // 补充复制的链表的rand指针 75 void AddRand(ComplexListNode* head) 76 { 77 ComplexListNode* node = head; 78 while (node != NULL) 79 { 80 ComplexListNode* newNode = node->next; 81 if (node->rand != NULL) 82 newNode->rand = node->rand->next; 83 node = newNode->next; 84 } 85 } 86 87 // 拆分链表 88 ComplexListNode* SplitList(ComplexListNode* head) 89 { 90 ComplexListNode* node = head; 91 ComplexListNode* newHead = NULL; 92 ComplexListNode* newNode = NULL; 93 94 if (node != NULL) 95 { 96 newHead = newNode = node->next; 97 node->next = newNode->next; 98 node = node->next; 99 } 100 while (node != NULL) 101 { 102 newNode->next = node->next; 103 newNode = newNode->next; 104 node->next = newNode->next; 105 node = node->next; 106 } 107 return newHead; 108 } 109 110 ComplexListNode* Clone(ComplexListNode* head) 111 { 112 CloneNodes(head); 113 AddRand(head); 114 return SplitList(head); 115 } 116 117 int main() 118 { 119 ComplexListNode* test = createList(); 120 PrintComplexList(test); 121 122 ComplexListNode* newTest = Clone(test); 123 PrintComplexList(test); 124 PrintComplexList(newTest); 125 126 }