-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathBasicoperationsLinkedList.cpp
More file actions
256 lines (253 loc) · 4.99 KB
/
BasicoperationsLinkedList.cpp
File metadata and controls
256 lines (253 loc) · 4.99 KB
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
#include<iostream>
using namespace std;
class node
{
public:
int data; // data = entered value
node* next; // next = pointer
// CONSTRUCTOR IS CREATED
node (int d)
{
data = d; // The input data
next = NULL; // The adress value
}
};
// Inserting at the head
void insertAtHead(node* &head , int data)
{
node *n = new node(data);
n -> next = head;
head = n;
}
//Counting the length of the linked list
int length(node *head)
{
int count = 0;
while(head != NULL)
{
head = head -> next;
count +=1;
}
return count;
}
//Inserting the node at the Tail
void insertatTail(node* &head, int data)
{
if(head == NULL)
{
head = new node(data);
return;
}
node *tail = head;
while(tail->next != NULL)
{
tail = tail->next;
}
node* n = new node(data);
tail->next = n;
return;
}
//Inserting the node at the middle
void insertIntheMiddle(node* &head , int data , int p)
{
if(head == NULL || p == 0)
{
insertAtHead(head,data);
}
else if(p > length(head))
{
insertatTail(head,data);
}
else
{
//Insert in the middle
//Take p-1 jumps
int jump = 1;
node*temp = head;
while(jump<=p-1)
{
temp = temp -> next;
jump +=1;
}
node*n = new node(data);
n->next = temp->next;
temp->next = n;
}
return;
}
//Deleting the node at the head
void deleteathead(node*&head)
{
if(head == NULL)
{
return; // Means node doesnt exist
}
node *temp = head ; //Storing head in temproray pointer
head = head -> next ; // Making head point to the next node
delete temp;
return;
}
//Deleting the node at the tail
void deleteattail(node*&head)
{
node *prev = NULL;
node *temp = head;
while(temp -> next != NULL)
{
prev = temp;
temp = temp -> next;
}
delete temp;
prev->next = NULL;
return;
}
//Deleting using the middle
void deleteatmiddle(node*&head, int pos)
{
int i = 1;
node*fast = head;
while (i<pos-1)
{
fast = fast->next;
i++;
}
node *prev = fast -> next;
fast->next = prev -> next;
delete prev;
return;
}
//Searching using recursion
bool searchin(node *&head , int key)
{
if(head == NULL)
{
return false;
}
if(head -> data == key)
{
return true;
}
else
{
return searchin(head->next , key);
}
}
//Searching using iteration
bool searchIterative(node *&head , int key)
{
while(head !=NULL)
{
if(head->data == key)
{
return true;
}
head = head -> next;
}
return false;
}
// Building the linked list until the node is -1
void buildList(node*&head)
{
int data;
cin>>data;
while(data!=-1)
{
insertatTail(head,data);
cin>>data;
}
}
//Reversing the Linked List
void reverse(node *&head)
{
node *C = head ; //Current Pointer
node *P = NULL ; //Previous Pointer
node *N;
while(C!=NULL)
{
//Save the next node
N = C -> next ;
// Make the current node point to prev
C -> next = P ;
//just update prev and current
P = C;
C = N;
}
head = P;
return;
}
//Reversing the Linked List using recursion
node *reverseRec(node *head)
{
//Base Case
if(head -> next == NULL || head == NULL)
{
return head;
}
//Rec case
node *smallhead = reverseRec(head->next);
node *C = head;
C->next->next = C;
C->next = NULL;
return smallhead;
}
void print(node *&head)
{
node *temp = head;
while(temp!= NULL)
{
cout<<temp->data<<"->"; //temp->data is used to access the data in the linked list
temp= temp -> next; // Next is used to move to next variable
}
}
int main()
{
node *head = NULL;
//Creating a list
buildList(head);
//Inserting the element at the head of the linked list
insertAtHead(head,5);
//Inserting the second element at the head of linked List
insertAtHead(head,4);
//Inserting the third element at the head of the Linked List
insertAtHead(head,3);
//Inserting the element at the tail of the Linked List
insertatTail(head,6);
//Inserting the element at the middle of the Linked List
insertIntheMiddle(head,2,8);
//Deleting at the Tail
deleteattail(head);
//Deleting at the Head
deleteathead(head);
//Deleting at the Middle
deleteatmiddle(head,2);
//To pass in overloaded function
node*head2 = NULL;
//Using operator overloading this would return the list; otherwise would have return the adress
cin>>head>>head2;
cout<<head<<endl<<head2;
// Reversing using iteration
reverse(head);
//Reversing using Recursion
head = reverseRec(NULL);
//Printing the value of head
print(head);
//Syntax to search the element in the list
if (searchin(head,4))
{
cout<<"Element found"<<endl;
}
else
{
cout<<"Element not found"<<endl;
}
//Syntax to search element using iteration
if (searchIterative(head,14))
{
cout<<"Element found"<<endl;
}
else
{
cout<<"element not found"<<endl;
}
return 0;
}