-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdouble_linkList.cpp
263 lines (234 loc) · 6.29 KB
/
double_linkList.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
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
257
258
259
260
261
262
263
// C++ program to Implement doubly linked list
#include <iostream>
using namespace std;
// Define a class named Node to represent a node in the
// doubly linked list.
class Node {
public:
// Data part of the node.
int data;
// Pointer to the next node.
Node* next;
// Pointer to the previous node.
Node* prev;
// Constructor to initialize the node with given data.
Node(int data)
{
this->data = data;
this->next = nullptr;
this->prev = nullptr;
}
};
// Function to insert a node at the beginning of the doubly
// linked list.
void insertAtBeginning(Node*& head, int data)
{
// Create a new node with the given data.
Node* newNode = new Node(data);
// Check if the doubly linked list is empty.
if (head == nullptr) {
head = newNode;
return;
}
// Update the next and previous pointers to insert the
// new node at the beginning.
newNode->next = head;
head->prev = newNode;
head = newNode;
}
// Function to insert a node at the end of the doubly linked
// list.
void insertAtEnd(Node*& head, int data)
{
// Create a new node with the given data.
Node* newNode = new Node(data);
// Check if the doubly linked list is empty.
if (head == nullptr) {
head = newNode;
return;
}
// Traverse to the last node of the list.
Node* temp = head;
while (temp->next != nullptr) {
temp = temp->next;
}
// Update the next and previous pointers to insert the
// new node at the end.
temp->next = newNode;
newNode->prev = temp;
}
// Function to insert a node at a specified position in the
// doubly linked list.
void insertAtPosition(Node*& head, int data, int position)
{
if (position < 1) {
cout << "Position should be >= 1." << endl;
return;
}
// If inserting at the head position.
if (position == 1) {
insertAtBeginning(head, data);
return;
}
// Create a new node with the given data.
Node* newNode = new Node(data);
Node* temp = head;
// Traverse to the node before the specified position.
for (int i = 1; temp != nullptr && i < position - 1;
i++) {
temp = temp->next;
}
// Check if the position is greater than the number of
// nodes.
if (temp == nullptr) {
cout << "Position greater than the number of nodes."
<< endl;
return;
}
// Update the next and previous pointers to insert the
// new node at the specified position.
newNode->next = temp->next;
newNode->prev = temp;
if (temp->next != nullptr) {
temp->next->prev = newNode;
}
temp->next = newNode;
}
// Function to delete a node from the beginning of the
// doubly linked list.
void deleteAtBeginning(Node*& head)
{
// Check if the doubly linked list is empty.
if (head == nullptr) {
cout << "The list is already empty." << endl;
return;
}
// Update the head pointer and delete the first node.
Node* temp = head;
head = head->next;
if (head != nullptr) {
head->prev = nullptr;
}
delete temp;
}
// Function to delete a node from the end of the doubly
// linked list.
void deleteAtEnd(Node*& head)
{
// Check if the doubly linked list is empty.
if (head == nullptr) {
cout << "The list is already empty." << endl;
return;
}
Node* temp = head;
// If there is only one node in the list.
if (temp->next == nullptr) {
head = nullptr;
delete temp;
return;
}
// Traverse to the last node of the list.
while (temp->next != nullptr) {
temp = temp->next;
}
// Update the previous pointer of the second last node
// and delete the last node.
temp->prev->next = nullptr;
delete temp;
}
// Function to delete a node from a specified position in
// the doubly linked list.
void deleteAtPosition(Node*& head, int position)
{
// Check if the doubly linked list is empty.
if (head == nullptr) {
cout << "The list is already empty." << endl;
return;
}
// If deleting the head node.
if (position == 1) {
deleteAtBeginning(head);
return;
}
Node* temp = head;
// Traverse to the node at the specified position.
for (int i = 1; temp != nullptr && i < position; i++) {
temp = temp->next;
}
// Check if the position is greater than the number of
// nodes.
if (temp == nullptr) {
cout << "Position is greater than the number of "
"nodes."
<< endl;
return;
}
// Update the next and previous pointers and delete the
// node at the specified position.
if (temp->next != nullptr) {
temp->next->prev = temp->prev;
}
if (temp->prev != nullptr) {
temp->prev->next = temp->next;
}
delete temp;
}
// Function to print the doubly linked list in forward
// direction.
void printListForward(Node* head)
{
Node* temp = head;
cout << "Forward List: ";
while (temp != nullptr) {
cout << temp->data << " ";
temp = temp->next;
}
cout << endl;
}
// Function to print the doubly linked list in reverse
// direction.
void printListReverse(Node* head)
{
Node* temp = head;
if (temp == nullptr) {
cout << "The list is empty." << endl;
return;
}
// Move to the end of the list.
while (temp->next != nullptr) {
temp = temp->next;
}
// Traverse backwards.
cout << "Reverse List: ";
while (temp != nullptr) {
cout << temp->data << " ";
temp = temp->prev;
}
cout << endl;
}
int main()
{
Node* head = nullptr;
// Demonstrating various operations on the doubly linked
// list.
// Insertion at End
insertAtEnd(head, 10);
insertAtEnd(head, 20);
// Insertion at beginning
insertAtBeginning(head, 5);
// Insertion at specific position
insertAtPosition(head, 15, 2);
// print the list
cout << "After Insertions:" << endl;
printListForward(head);
printListReverse(head);
// deletion from beginning
deleteAtBeginning(head);
// deletion from end
deleteAtEnd(head);
// deletion from specific position
deleteAtPosition(head, 2);
cout << "After Deletions:" << endl;
printListForward(head);
return 0;
}