Data Structure in C++: Single Linked List (Part-1)

Mohammed Muzahidul Islam
6 min readSep 10, 2024

--

Question 1:

Take a single linked list as input and print the size of the linked list.

Sample Input

2 1 5 3 4 8 9 -1

Sample Output

7

Sample Input

5 1 4 5 -1

Sample Output

4

Try on your own first.

Photo by Jonathan Chng on Unsplash

Answer:

#include <bits/stdc++.h>
using namespace std;

class Node {
public:
int val;
Node* next;
Node(int val) {
this->val = val;
this->next = NULL;
}
};

// Function to calculate the size of the linked list
int getSize(Node* head) {
int size = 0;
Node* current = head;
while (current != NULL) {
size++;
current = current->next;
}
return size;
}

int main() {
Node* head = NULL;
Node* tail = NULL;
int val;

// Inputting values into the linked list
while (cin >> val && val != -1) {
Node* new_node = new Node(val);
if (head == NULL) {
head = tail = new_node;
} else {
tail->next = new_node;
tail = new_node;
}
}

// Print the size of the linked list
cout << getSize(head) << endl;
return 0;
}

Question 2: Take a single linked list as input and check if the linked list contains any duplicate value. You can assume that the maximum value will be 100.

Sample Input

5 4 8 6 2 1 -1

Sample Output

NO

Sample Input

2 4 5 6 7 4 -1

Sample Output

YES

Try on your own:

Photo by Luca Bravo on Unsplash

Answer:

#include <bits/stdc++.h>
using namespace std;
class Node {
public:
int val;
Node* next;
Node(int val) {
this->val = val;
this->next = NULL;
}
};
// Function to check for duplicates in the linked list
bool hasDuplicate(Node* head) {
bool seen[101] = {false}; // Array to track seen values (0 to 100)
Node* current = head;
while (current != NULL) {
if (seen[current->val]) {
return true; // Duplicate found
}
seen[current->val] = true;
current = current->next;
}
return false; // No duplicates
}
int main() {
Node* head = NULL;
Node* tail = NULL;
int val;
// Inputting values into the linked list
while (cin >> val && val != -1) {
Node* new_node = new Node(val);
if (head == NULL) {
head = tail = new_node;
} else {
tail->next = new_node;
tail = new_node;
}
}
// Check for duplicates and print the result
if (hasDuplicate(head)) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
return 0;
}

Question 3: Take a singly linked list as input and print the middle element. If there are multiple values in the middle print both.

Sample Input

2 4 6 8 10 -1

Sample Output

6

Sample Input

1 2 3 4 5 6 -1

Sample Output

3 4

Sample Input

2 1 5 3 4 8 9 8 -1

Sample Output

3 4

Try on your own first.

Answer:

#include <bits/stdc++.h>
using namespace std;

class Node {
public:
int val;
Node* next;
Node(int val) {
this->val = val;
this->next = NULL;
}
};

// Function to find and print the middle element(s) of the linked list
void printMiddle(Node* head) {
if (head == NULL) {
return;
}

Node* slow = head;
Node* fast = head;

// Use two pointers: slow moves one step, fast moves two steps
while (fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
}

// If the total number of nodes is even, print the two middle elements
if (fast == NULL) {
Node* midPrev = head;
while (midPrev->next != slow) {
midPrev = midPrev->next;
}
cout << midPrev->val << " " << slow->val << endl;
} else {
// If the total number of nodes is odd, print the single middle element
cout << slow->val << endl;
}
}

int main() {
Node* head = NULL;
Node* tail = NULL;
int val;

// Inputting values into the linked list
while (cin >> val && val != -1) {
Node* new_node = new Node(val);
if (head == NULL) {
head = tail = new_node;
} else {
tail->next = new_node;
tail = new_node;
}
}

// Print the middle element(s)
printMiddle(head);
return 0;
}

Question 4: Take a singly linked list as input and check if the linked list is sorted in ascending order.

Sample Input

1 5 6 8 9 -1

Sample Output

YES

Sample Input

2 4 6 5 8 4 -1

Sample Output

NO

Try on your own first.

https://media.geeksforgeeks.org/wp-content/uploads/20240410135517/linked-list.webp

Answer:

#include <bits/stdc++.h>
using namespace std;

class Node {
public:
int val;
Node* next;
Node(int val) {
this->val = val;
this->next = NULL;
}
};

// Function to check if the linked list is sorted in ascending order
bool isSorted(Node* head) {
Node* current = head;
while (current != NULL && current->next != NULL) {
if (current->val > current->next->val) {
return false; // Not sorted
}
current = current->next;
}
return true; // Sorted
}

int main() {
Node* head = NULL;
Node* tail = NULL;
int val;

// Inputting values into the linked list
while (cin >> val && val != -1) {
Node* new_node = new Node(val);
if (head == NULL) {
head = tail = new_node;
} else {
tail->next = new_node;
tail = new_node;
}
}

// Check if the linked list is sorted and print the result
if (isSorted(head)) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}

return 0;
}

Hardest Question 5: Take a singly linked list as input, then take q queries. In each query, you will be given an index and value. You need to insert those values in the given index and print the linked list. If the index is invalid print “Invalid”.

Sample Input

10 20 30 -1

1 40

5 50

4 50

0 100

7 40

1 110

7 40

Sample Output

10 40 20 30

Invalid

10 40 20 30 50

100 10 40 20 30 50

Invalid

100 110 10 40 20 30 50

100 110 10 40 20 30 50 40

Try on your own.

Photo by ThisisEngineering on Unsplash

Answer:

#include <bits/stdc++.h>
using namespace std;

class Node {
public:
int val;
Node* next;
Node(int val) {
this->val = val;
this->next = NULL;
}
};

// Function to print the linked list
void print_linked_list(Node* head) {
Node* current = head;
while (current != NULL) {
cout << current->val << " ";
current = current->next;
}
cout << endl;
}

// Function to insert a value at a specific index in the linked list
void insertAtIndex(Node*& head, int index, int value) {
Node* new_node = new Node(value);

if (index == 0) {
new_node->next = head;
head = new_node;
print_linked_list(head);
return;
}

Node* current = head;
for (int i = 0; i < index - 1 && current != NULL; i++) {
current = current->next;
}

if (current == NULL) {
cout << "Invalid" << endl;
delete new_node;
return;
}

new_node->next = current->next;
current->next = new_node;
print_linked_list(head);
}

int main() {
Node* head = NULL;
Node* tail = NULL;
int val;

// Inputting values into the linked list
while (cin >> val && val != -1) {
Node* new_node = new Node(val);
if (head == NULL) {
head = tail = new_node;
} else {
tail->next = new_node;
tail = new_node;
}
}

int index, value;
// Reading and handling queries
while (cin >> index >> value) {
insertAtIndex(head, index, value);
}

return 0;
}

Please Clap, Share, and Follow.

--

--