forked from adityabisoi/ds-algo-solutions
-
Notifications
You must be signed in to change notification settings - Fork 0
/
solution.cpp
131 lines (97 loc) · 3.35 KB
/
solution.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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/******
All functions except reverse() are pre-written.
The user only need to complete the reverse() function
******/
#include <bits/stdc++.h> // Header for doing I/O operations
using namespace std;
// Class of Linked List's Nodes
class SinglyLinkedListNode {
public:
int data;
SinglyLinkedListNode *next;
// Constructor for initializing data members (variables)
SinglyLinkedListNode(int node_data) {
this->data = node_data;
this->next = nullptr;
}
};
// Class of Linked Lists
class SinglyLinkedList {
public:
SinglyLinkedListNode *head;
SinglyLinkedListNode *tail;
// Constructor for initializing data members (variables)
SinglyLinkedList() {
this->head = nullptr;
this->tail = nullptr;
}
// Function to insert a node in the Linked List
void insert_node(int node_data) {
SinglyLinkedListNode* node = new SinglyLinkedListNode(node_data);
if (!this->head) {
this->head = node;
} else {
this->tail->next = node;
}
this->tail = node;
}
};
// Function to Print the Linked List
void print_singly_linked_list(SinglyLinkedListNode* node, string sep, ofstream& fout) {
while (node) {
fout << node->data;
node = node->next;
if (node) {
fout << sep;
}
}
}
// Function to delete the Linked List
void free_singly_linked_list(SinglyLinkedListNode* node) {
while (node) {
SinglyLinkedListNode* temp = node;
node = node->next;
free(temp);
}
}
SinglyLinkedListNode* reverse(SinglyLinkedListNode* head) {
// This is the base case of the recursive function
// If the address of the next node is NULL then the current node is the last node
if(head->next == NULL) return head;
// Recursively call reverse() function
// The return value of the function (st) is the address of the Last node
SinglyLinkedListNode* st = reverse(head->next);
// While Backtracking , flip the direction of the current link
// This reverses the Linked List
head->next->next = head; // This operation is similar to changing [ ]->[ ] to [ ]<-[ ]
head->next=NULL; // This operation is similar to changing [ ]->[ ] to NULL<-[ ]
// Return the address of the last node , which is the new head
return st;
}
// pre-written main() function
// Takes input from the user , declares Linked Lists and calls functions accordingly
int main()
{
ofstream fout(getenv("OUTPUT_PATH"));
int tests;
cin >> tests;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
for (int tests_itr = 0; tests_itr < tests; tests_itr++) {
SinglyLinkedList* llist = new SinglyLinkedList();
int llist_count;
cin >> llist_count;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
for (int i = 0; i < llist_count; i++) {
int llist_item;
cin >> llist_item;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
llist->insert_node(llist_item);
}
SinglyLinkedListNode* llist1 = reverse(llist->head);
print_singly_linked_list(llist1, " ", fout);
fout << "\n";
free_singly_linked_list(llist1);
}
fout.close();
return 0;
}