剑指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
", head->val, head->rand->val);
 52         else
 53             printf("%d
", head->val);
 54         head = head->next;
 55     }
 56     printf("
");
 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 }
原文地址:https://www.cnblogs.com/Juntaran/p/5825983.html