首页 > 代码库 > 剑指Offer24 复杂链表的复制
剑指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 }
剑指Offer24 复杂链表的复制
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。