-
Notifications
You must be signed in to change notification settings - Fork 0
/
Clone-a-L.L.cpp
102 lines (86 loc) · 2.69 KB
/
Clone-a-L.L.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
class Solution
{
private:
void insertAtTail(Node* &head, Node* &tail, int d) {
Node* newNode = new Node(d);
if(head == NULL) {
head = newNode;
tail = newNode;
}
else
{
tail -> next = newNode;
tail = newNode;
}
}
void print(Node* head) {
while(head != NULL) {
cout << head -> data << " ";
head = head -> next;
}cout << endl;
}
void printRandom(Node* head) {
while(head != NULL) {
cout << " head data: " << head->data <<" ";
if(head ->random != NULL) {
cout << " head random data" << head -> random ->data;
}
else
{
cout << " head random data: NULL";
}
head = head -> next;
cout << endl;
}
}
public:
Node *copyList(Node *head)
{
//step 1: Create a Clone List
Node* cloneHead = NULL;
Node* cloneTail = NULL;
Node* temp = head;
while(temp != NULL) {
insertAtTail(cloneHead, cloneTail, temp->data);
temp = temp -> next;
}
// step 2: insert nodes of Clone List in between originalList
Node* originalNode = head;
Node* cloneNode = cloneHead;
while(originalNode != NULL && cloneNode != NULL) {
Node* next = originalNode -> next;
originalNode -> next = cloneNode;
originalNode = next;
next = cloneNode -> next;
cloneNode -> next = originalNode;
cloneNode = next;
}
// step 3: Random pointer copy
originalNode = head;
cloneNode = cloneHead;
while(originalNode != NULL && cloneNode != NULL) {
if(originalNode -> random != NULL) {
cloneNode -> random = originalNode -> random -> next;
}
else
{
cloneNode -> random = NULL;
}
cloneNode = cloneNode -> next;
originalNode = originalNode -> next;
}
//step 4: revert step 2 changes
Node* original = head;
Node* copy = cloneHead;
while (original && copy)
{
original->next =
original->next? original->next->next : original->next;
copy->next = copy->next?copy->next->next:copy->next;
original = original->next;
copy = copy->next;
}
// step 5 answer return
return cloneHead;
}
};