1+
2+ /*
3+ * Algorithm: Menu Driven Linked List
4+ * Description: Implementation of a linked list with menu options
5+ * (insert, delete, display,middle, exit and many more ).
6+ * Time Complexity: O(n) for insertion/search/deletion
7+ * Space Complexity: O(n)
8+ * Author: Ayush Kumar Anand
9+ * Date: 2025-10-01
10+ */
11+ #include < iostream>
12+ using namespace std ;
13+
14+ class LinkedList {
15+ private:
16+ struct Node {
17+ int data;
18+ Node* next;
19+ };
20+ Node* head = nullptr ;
21+
22+ public:
23+ // Display list
24+ void display () {
25+ if (!head) {
26+ cout << " List is empty!\n " ;
27+ return ;
28+ }
29+ cout << " Linked List: " ;
30+ Node* temp = head;
31+ while (temp) {
32+ cout << temp->data << " -> " ;
33+ temp = temp->next ;
34+ }
35+ cout << " NULL\n " ;
36+ }
37+
38+ // Create list with n nodes
39+ void createList (int n) {
40+ head = nullptr ;
41+ Node *temp = nullptr ;
42+ for (int i = 0 ; i < n; i++) {
43+ int val;
44+ cout << " Enter value for node " << i + 1 << " : " ;
45+ cin >> val;
46+ Node* newNode = new Node{val, nullptr };
47+ if (!head) {
48+ head = newNode;
49+ temp = head;
50+ } else {
51+ temp->next = newNode;
52+ temp = newNode;
53+ }
54+ }
55+ cout << " List created successfully\n " ;
56+ }
57+
58+ // Insert at beginning
59+ void insertAtBeginning (int val) {
60+ Node* newNode = new Node{val, head};
61+ head = newNode;
62+ }
63+
64+ // Insert at end
65+ void insertAtEnd (int val) {
66+ Node* newNode = new Node{val, nullptr };
67+ if (!head) {
68+ head = newNode;
69+ return ;
70+ }
71+ Node* temp = head;
72+ while (temp->next ) temp = temp->next ;
73+ temp->next = newNode;
74+ }
75+
76+ // Insert at position
77+ void insertAtPosition (int pos, int val) {
78+ Node* newNode = new Node{val, nullptr };
79+ if (pos == 1 ) {
80+ newNode->next = head;
81+ head = newNode;
82+ return ;
83+ }
84+ Node* temp = head;
85+ for (int i = 1 ; temp && i < pos - 1 ; i++) temp = temp->next ;
86+ if (!temp) {
87+ cout << " Position out of range!\n " ;
88+ delete newNode;
89+ return ;
90+ }
91+ newNode->next = temp->next ;
92+ temp->next = newNode;
93+ }
94+
95+ // Insert after element
96+ void insertAfterElement (int element, int val) {
97+ Node* temp = head;
98+ while (temp && temp->data != element) temp = temp->next ;
99+ if (!temp) {
100+ cout << " Element " << element << " not found!\n " ;
101+ return ;
102+ }
103+ Node* newNode = new Node{val, temp->next };
104+ temp->next = newNode;
105+ cout << " Inserted " << val << " after " << element << " \n " ;
106+ }
107+
108+ // Delete first node
109+ void deleteFirst () {
110+ if (!head) {
111+ cout << " List is empty!\n " ;
112+ return ;
113+ }
114+ Node* temp = head;
115+ head = head->next ;
116+ cout << " Deleted node with value " << temp->data << " \n " ;
117+ delete temp;
118+ }
119+
120+ // Delete last node
121+ void deleteLast () {
122+ if (!head) {
123+ cout << " List is empty!\n " ;
124+ return ;
125+ }
126+ if (!head->next ) {
127+ cout << " Deleted node with value " << head->data << " \n " ;
128+ delete head;
129+ head = nullptr ;
130+ return ;
131+ }
132+ Node* temp = head;
133+ while (temp->next ->next ) temp = temp->next ;
134+ cout << " Deleted node with value " << temp->next ->data << " \n " ;
135+ delete temp->next ;
136+ temp->next = nullptr ;
137+ }
138+
139+ // Delete at position
140+ void deleteAtPosition (int pos) {
141+ if (!head) {
142+ cout << " List is empty!\n " ;
143+ return ;
144+ }
145+ Node* temp = head;
146+ if (pos == 1 ) {
147+ head = head->next ;
148+ cout << " Deleted node with value " << temp->data << " at position 1\n " ;
149+ delete temp;
150+ return ;
151+ }
152+ for (int i = 1 ; temp && i < pos - 1 ; i++) temp = temp->next ;
153+ if (!temp || !temp->next ) {
154+ cout << " Wrong position!\n " ;
155+ return ;
156+ }
157+ Node* del = temp->next ;
158+ temp->next = del->next ;
159+ cout << " Deleted node with value " << del->data << " at position " << pos << " \n " ;
160+ delete del;
161+ }
162+
163+ // Delete after element
164+ void deleteAfterElement (int element) {
165+ Node* temp = head;
166+ while (temp && temp->data != element) temp = temp->next ;
167+ if (!temp) {
168+ cout << " Element " << element << " not found!\n " ;
169+ return ;
170+ }
171+ if (!temp->next ) {
172+ cout << " No node exists after element " << element << " \n " ;
173+ return ;
174+ }
175+ Node* del = temp->next ;
176+ temp->next = del->next ;
177+ cout << " Deleted node with value " << del->data << " after element " << element << " \n " ;
178+ delete del;
179+ }
180+
181+ // Append another list
182+ void appendList () {
183+ int n, val;
184+ cout << " Enter number of nodes to append: " ;
185+ cin >> n;
186+ if (n <= 0 ) {
187+ cout << " Nothing to append!\n " ;
188+ return ;
189+ }
190+ Node* newHead = nullptr ;
191+ Node* temp = nullptr ;
192+ for (int i = 0 ; i < n; i++) {
193+ cout << " Enter value for node " << i + 1 << " : " ;
194+ cin >> val;
195+ Node* newNode = new Node{val, nullptr };
196+ if (!newHead) {
197+ newHead = newNode;
198+ temp = newHead;
199+ } else {
200+ temp->next = newNode;
201+ temp = newNode;
202+ }
203+ }
204+ if (!head) {
205+ head = newHead;
206+ return ;
207+ }
208+ temp = head;
209+ while (temp->next ) temp = temp->next ;
210+ temp->next = newHead;
211+ cout << " Another list appended successfully!\n " ;
212+ }
213+
214+ // Sort list
215+ void sortList () {
216+ if (!head) {
217+ cout << " List is empty!\n " ;
218+ return ;
219+ }
220+ for (Node* i = head; i; i = i->next ) {
221+ for (Node* j = i->next ; j; j = j->next ) {
222+ if (i->data > j->data ) swap (i->data , j->data );
223+ }
224+ }
225+ cout << " List sorted successfully!\n " ;
226+ }
227+
228+ // Reverse print
229+ void reversePrint (Node* node) {
230+ if (!node) return ;
231+ reversePrint (node->next );
232+ cout << node->data << " -> " ;
233+ }
234+ void reverse () {
235+ cout << " Reversed List: " ;
236+ reversePrint (head);
237+ cout << " NULL\n " ;
238+ }
239+
240+ // Display middle node
241+ void displayMiddle () {
242+ if (!head) {
243+ cout << " List is empty!\n " ;
244+ return ;
245+ }
246+ Node* slow = head;
247+ Node* fast = head;
248+ while (fast && fast->next ) {
249+ slow = slow->next ;
250+ fast = fast->next ->next ;
251+ }
252+ cout << " Middle node value: " << slow->data << " \n " ;
253+ }
254+
255+ // Count nodes
256+ int countNodes () {
257+ int count = 0 ;
258+ for (Node* temp = head; temp; temp = temp->next ) count++;
259+ return count;
260+ }
261+
262+ // Find largest and smallest
263+ void findLargestSmallest () {
264+ if (!head) {
265+ cout << " List is empty!\n " ;
266+ return ;
267+ }
268+ int largest = head->data ;
269+ int smallest = head->data ;
270+ for (Node* temp = head; temp; temp = temp->next ) {
271+ if (temp->data > largest) largest = temp->data ;
272+ if (temp->data < smallest) smallest = temp->data ;
273+ }
274+ cout << " Largest = " << largest << " , Smallest = " << smallest << " \n " ;
275+ }
276+ };
277+
278+ int main () {
279+ LinkedList list;
280+ int choice, n, val, pos, element;
281+
282+ while (true ) {
283+ cout << " \n --- Linked List Menu ---\n " ;
284+ cout << " 0. Display\n 1. Create a single linked list\n 2. Insert at beginning\n 3. Insert at end\n " ;
285+ cout << " 4. Insert at ith position\n 5. Insert after element\n 6. Delete first node\n 7. Delete last node\n " ;
286+ cout << " 8. Delete at ith position\n 9. Delete after element\n 11. Append another list\n 12. Sort list\n " ;
287+ cout << " 13. Print reversed list\n 14. Display middle node\n 15. Count nodes\n 16. Find largest & smallest\n 18. EXIT\n " ;
288+ cout << " Enter your choice: " ;
289+ cin >> choice;
290+
291+ switch (choice) {
292+ case 0 : list.display (); break ;
293+ case 1 : cout << " Enter number of nodes: " ; cin >> n; list.createList (n); break ;
294+ case 2 : cout << " Enter value: " ; cin >> val; list.insertAtBeginning (val); break ;
295+ case 3 : cout << " Enter value: " ; cin >> val; list.insertAtEnd (val); break ;
296+ case 4 : cout << " Enter position and value: " ; cin >> pos >> val; list.insertAtPosition (pos, val); break ;
297+ case 5 : cout << " Enter element and value: " ; cin >> element >> val; list.insertAfterElement (element, val); break ;
298+ case 6 : list.deleteFirst (); break ;
299+ case 7 : list.deleteLast (); break ;
300+ case 8 : cout << " Enter position to delete: " ; cin >> pos; list.deleteAtPosition (pos); break ;
301+ case 9 : cout << " Enter element after which to delete: " ; cin >> element; list.deleteAfterElement (element); break ;
302+ case 11 : list.appendList (); break ;
303+ case 12 : list.sortList (); break ;
304+ case 13 : list.reverse (); break ;
305+ case 14 : list.displayMiddle (); break ;
306+ case 15 : cout << " Total nodes: " << list.countNodes () << " \n " ; break ;
307+ case 16 : list.findLargestSmallest (); break ;
308+ case 18 : exit (0 );
309+ default : cout << " Invalid choice!\n " ; break ;
310+ }
311+ }
312+ }
0 commit comments