Tag: linked list problems

  • Master How to Count Duplicates in a Linked List (2026)

    Learn how to count duplicates in a linked list in C++ with this beginner-friendly guide. Step-by-step explanation, easy-to-understand code, and tips for detecting duplicate nodes efficiently.

    Linked lists are one of the fundamental data structures in programming. While they are simple to understand, performing operations like counting duplicates can be tricky for beginners. In this guide, we will explain how to count duplicates in a linked list in an easy-to-understand, step-by-step way.

    What is a Linked List?

    A linked list is a collection of nodes where each node contains two things:

    1. Data – The value stored in the node.
    2. Pointer (Next) – A reference to the next node in the list.

    For example, a linked list can look like this:

    1 → 2 → 2 → 3 → 3 → 3 → 4
    

    What Are Duplicates in a Linked List?

    Duplicates are values that appear more than once in the linked list.

    In the example above:

    • 2 appears twice → 1 duplicate
    • 3 appears three times → 2 duplicates

    Total duplicates = 3

    Step-By-Step Approach to Count Duplicates

    Here’s a simple way to count duplicates, perfect for beginners:

    1. Start with the first node (curr).
    2. Compare it with all nodes that come after it (temp).
    3. If a node has the same value as curr, it’s a duplicate.
    4. Move to the next node and repeat until the end.

    Understanding the Key Line: Node* temp = curr->next;

    One line often confuses beginners:

    Node* temp = curr->next;

    Here’s what it means:

    • Node* temp → temp is a pointer that can point to a node.
    • curr->next → the next node after the current node.
    • Together → temp starts checking from the node after curr, not from the beginning. This avoids counting the same value multiple times.

    Count Duplicates in a Linked List : C++ Code

    #include <iostream>
    using namespace std;
    
    class Node {
    public:
        int data;
        Node* next;
    
        Node(int data) {
            this->data = data;
            this->next = NULL;
        }
    };
    
    // Function to count duplicates
    int countDuplicates(Node* head) {
        int count = 0;
        Node* curr = head;
    
        while (curr != NULL) {
            Node* temp = curr->next; // Start checking from next node
    
            while (temp != NULL) {
                if (curr->data == temp->data) {
                    count++;
                    break; // Count only once per value
                }
                temp = temp->next;
            }
            curr = curr->next;
        }
    
        return count;
    }
    
    // Main function
    int main() {
        Node* head = new Node(1);
        head->next = new Node(2);
        head->next->next = new Node(2);
        head->next->next->next = new Node(3);
        head->next->next->next->next = new Node(3);
        head->next->next->next->next->next = new Node(3);
        head->next->next->next->next->next->next = new Node(4);
    
        cout << "Total duplicate nodes: " << countDuplicates(head) << endl;
        return 0;
    }
    

    How This Works

    1. curr pointer moves node by node.
    2. temp pointer checks all nodes after curr.
    3. If curr->data == temp->data, we found a duplicate.
    4. Count is updated once per duplicate value.

    Time and Space Complexity

    • Time Complexity: O(n²) – two nested loops
    • Space Complexity: O(1) – no extra memory used

    Note: For beginners, this approach is easy to understand. Advanced methods (like using a hash map) can reduce time complexity.

    Time Complexity

    Answer:

    Time Complexity = O(n²)

    Why O(n²)? (How we calculate it)

    Look at this part of the code:

    while (curr != NULL) {          // Outer loop
        Node* temp = curr->next;
    
        while (temp != NULL) {      // Inner loop
            if (curr->data == temp->data) {
                count++;
                break;
            }
            temp = temp->next;
        }
        curr = curr->next;
    }
    

    Step-by-step thinking

    • Let total number of nodes = n

    Outer loop (curr)

    • Runs for every node
    • So it runs n times

    Inner loop (temp)

    • For each curr, it checks the remaining nodes
    • In worst case:
      • First time → checks ~ (n-1) nodes
      • Second time → checks ~ (n-2) nodes
      • …
      • Last time → checks 1 node

    Total comparisons (worst case)

    (n-1) + (n-2) + (n-3) + ... + 1
    

    This adds up to:

    n² (approximately)
    

    That’s why Time Complexity = O(n²)

    Simple line to remember (for exams/interviews)

    Since there are two nested loops, the time complexity is O(n²).

    Space Complexity

    Answer:

    Space Complexity = O(1)

    Why O(1)? (How we calculate it)

    Let’s see what extra memory we use:

    int count;
    Node* curr;
    Node* temp;
    
    • These are just variables and pointers
    • They do not grow with input size
    • No arrays, maps, or extra lists are used

    What we are NOT using

    • No extra linked list
    • No hash map
    • No array

    So memory usage stays constant, no matter how big the linked list is.

    Therefore, Space Complexity = O(1)

    Final Summary (Perfect for Notes)

    TypeComplexity
    Time ComplexityO(n²)
    Space ComplexityO(1)

    Tips for Beginners

    • Use two loops to make your logic clear.
    • Always check from the next node, not from the head again.
    • Use visual examples to understand how curr and temp work.

    Frequently Asked Questions (FAQ)

    1. What is a duplicate in a linked list?

    A duplicate is a node whose value appears more than once in a linked list. For example, in the list 1 → 2 → 2 → 3, the value 2 is a duplicate because it appears twice.

    2. Why do we use Node* temp = curr->next?

    This line ensures that we start checking for duplicates from the node after the current one (curr). It avoids re-checking nodes and makes counting accurate.

    3. Can we count duplicates in a sorted linked list faster?

    Yes! In a sorted linked list, duplicates are always next to each other. So, we can use a single loop to compare each node with the next, which reduces time complexity from O(n²) to O(n).

    4. What is the time complexity of this method?

    The beginner-friendly method using two nested loops has O(n²) time complexity, where n is the number of nodes in the list.

    5. Can we count duplicates without using extra space?

    Yes, the method shown in this guide uses O(1) extra space, meaning no additional memory is required apart from the linked list itself.

    6. How is this different from using a hash map?

    Using a hash map can reduce the time complexity to O(n), but it uses extra memory to store counts. The method in this guide is memory-efficient and easier for beginners to understand.

    7. Can this method handle strings or other data types?

    Yes, as long as the linked list stores comparable data (like integers, characters, or strings), you can modify the comparison curr->data == temp->data accordingly.

    Read More : Master Most Asked Stack Coding Questions in Interviews

  • Master Linked List Coding Questions (2026)

    Learn Basic Linked List Coding Questions with simple explanations and beginner-friendly code examples. Perfect for students and interview preparation.

    Basic Linked List Coding Questions are designed to help beginners master one of the most fundamental data structures in programming. A linked list is a collection of nodes where each node contains data and a reference (or pointer) to the next node in the sequence. Unlike arrays, linked lists allow dynamic memory allocation, making them highly useful for scenarios where the size of the data can change frequently.

    These coding questions cover all the essential operations of a linked list, such as:

    • Creating a linked list: Understanding how to initialize nodes and link them together.
    • Insertion: Adding new nodes at the beginning, middle, or end of the list.
    • Deletion: Removing nodes safely without breaking the chain.
    • Traversal: Accessing each node to perform operations like printing data or finding elements.
    • Searching: Locating a specific value within the list.
    • Counting nodes: Determining the size of the list dynamically.

    Practicing these questions builds a strong foundation in pointers, memory management, and dynamic data structures, which are crucial for coding interviews, competitive programming, and real-world software development.

    This guide focuses on beginner-friendly explanations and clean code examples, making it easy to follow step by step. By solving these questions, you not only learn the mechanics of linked lists but also improve problem-solving skills, logical thinking, and confidence in handling more complex data structures in the future.

    Whether you are a student, a beginner programmer, or preparing for interviews, mastering basic linked list coding questions is the first step toward becoming a proficient programmer.

    Creation & Traversal

    1. Create a singly linked list
    2. Traverse and print a linked list
    3. Count number of nodes in a linked list
    4. Search an element in a linked list
    5. Find length of linked list (iterative & recursive)

    Insertion

    1. Insert at head
    2. Insert at tail
    3. Insert at a given position
    4. Insert after a given value
    5. Insert before a given value
    6. Insert in the middle of linked list

    Deletion

    1. Delete head node
    2. Delete tail node
    3. Delete node at a given position
    4. Delete node by value
    5. Delete entire linked list

    Basic Pointer Logic

    1. Find middle of linked list
    2. Find Nth node from beginning
    3. Find Nth node from end
    4. Check if linked list is empty

    Reversal

    1. Reverse linked list (iterative)
    2. Reverse linked list (recursive)
    3. Reverse first K nodes

    Two Pointer / Slow-Fast

    1. Detect loop in linked list
    2. Find starting point of loop
    3. Remove loop from linked list

    Comparison & Checking

    1. Check if linked list is palindrome
    2. Compare two linked lists
    3. Check if two linked lists intersect

    Sorting & Merging

    1. Merge two sorted linked lists
    2. Sort a linked list
    3. Remove duplicates from sorted list
    4. Remove duplicates from unsorted list

    Interview-Famous Basics

    1. Add two numbers represented by linked lists
    2. Rotate linked list
    3. Pairwise swap nodes
    4. Delete alternate nodes
    5. Move last node to front

    MUST-DO (Very Important)

    If you do only these 10, you’re good for interviews:

    1. Insert at head
    2. Insert at tail
    3. Insert at position
    4. Delete at position
    5. Reverse linked list
    6. Find middle
    7. Nth node from end
    8. Detect loop
    9. Remove duplicates
    10. Merge two sorted lists
    11.Add Two Numbers in a Linked List
    
    #include <iostream>
    using namespace std;
    
    // Node structure
    class Node {
    public:
        int data;
        Node* next;
    
        // Constructor
        Node(int data) {
            this->data = data;
            this->next = NULL;
        }
    };
    
    // Insert at Tail
    void insertAtTail(Node* &head, int data) {
        Node* newNode = new Node(data);
    
        // If list is empty
        if (head == NULL) {
            head = newNode;
            return;
        }
    
        Node* temp = head;
        while (temp->next != NULL) {
            temp = temp->next;
        }
        temp->next = newNode;
    }
    
    // Display Linked List
    void printList(Node* head) {
        Node* temp = head;
        while (temp != NULL) {
            cout << temp->data << " -> ";
            temp = temp->next;
        }
        cout << "NULL";
    }
    
    // Main function
    int main() {
        Node* head = NULL;
    
        insertAtTail(head, 10);
        insertAtTail(head, 20);
        insertAtTail(head, 30);
        insertAtTail(head, 40);
    
        cout << "Singly Linked List: ";
        printList(head);
    
        return 0;
    }
    #include <iostream>
    using namespace std;
    
    // Node structure
    class Node {
    public:
        int data;
        Node* next;
    
        Node(int data) {
            this->data = data;
            this->next = NULL;
        }
    };
    
    // Traverse and print function
    void traverseAndPrint(Node* head) {
        Node* temp = head;
    
        while (temp != NULL) {
            cout << temp->data << " -> ";
            temp = temp->next;
        }
        cout << "NULL";
    }
    
    // Main function
    int main() {
        // Creating linked list manually
        Node* head = new Node(10);
        head->next = new Node(20);
        head->next->next = new Node(30);
    
        cout << "Linked List: ";
        traverseAndPrint(head);
    
        return 0;
    }
    #include <iostream>
    using namespace std;
    
    // Node structure
    class Node {
    public:
        int data;
        Node* next;
    
        Node(int data) {
            this->data = data;
            this->next = NULL;
        }
    };
    
    // Function to count nodes
    int countNodes(Node* head) {
        int count = 0;
        Node* temp = head;
    
        while (temp != NULL) {
            count++;
            temp = temp->next;
        }
        return count;
    }
    
    // Main function
    int main() {
        Node* head = new Node(10);
        head->next = new Node(20);
        head->next->next = new Node(30);
        head->next->next->next = new Node(40);
    
        cout << "Number of nodes: " << countNodes(head);
    
        return 0;
    }
    #include <iostream>
    using namespace std;
    
    // Node structure
    class Node {
    public:
        int data;
        Node* next;
    
        Node(int data) {
            this->data = data;
            this->next = NULL;
        }
    };
    
    // Search function
    bool searchElement(Node* head, int key) {
        Node* temp = head;
    
        while (temp != NULL) {
            if (temp->data == key) {
                return true;   // Element found
            }
            temp = temp->next;
        }
        return false;          // Element not found
    }
    
    // Main function
    int main() {
        Node* head = new Node(10);
        head->next = new Node(20);
        head->next->next = new Node(30);
        head->next->next->next = new Node(40);
    
        int key = 30;
    
        if (searchElement(head, key))
            cout << "Element found in the linked list";
        else
            cout << "Element not found in the linked list";
    
        return 0;
    }

    Recursive Search

    bool searchRecursive(Node* head, int key) {
        if (head == NULL)
            return false;
    
        if (head->data == key)
            return true;
    
        return searchRecursive(head->next, key);
    }
    
    #include <iostream>
    using namespace std;
    
    class Node {
    public:
        int data;
        Node* next;
    
        Node(int data) {
            this->data = data;
            this->next = NULL;
        }
    };
    
    int lengthIterative(Node* head) {
        int count = 0;
        Node* temp = head;
    
        while (temp != NULL) {
            count++;
            temp = temp->next;
        }
        return count;
    }
    

    Recursive Method

    int lengthRecursive(Node* head) {
        if (head == NULL)
            return 0;
    
        return 1 + lengthRecursive(head->next);
    }
    #include <iostream>
    using namespace std;
    
    // Node structure
    class Node {
    public:
        int data;
        Node* next;
    
        Node(int data) {
            this->data = data;
            this->next = NULL;
        }
    };
    
    // Insert at head function
    void insertAtHead(Node* &head, int data) {
        Node* newNode = new Node(data); // Step 1: create new node
        newNode->next = head;           // Step 2: point to current head
        head = newNode;                 // Step 3: update head
    }
    
    // Print linked list
    void printList(Node* head) {
        Node* temp = head;
        while (temp != NULL) {
            cout << temp->data << " -> ";
            temp = temp->next;
        }
        cout << "NULL" << endl;
    }
    
    // Main function
    int main() {
        Node* head = NULL; // empty linked list
    
        insertAtHead(head, 10);
        insertAtHead(head, 20);
        insertAtHead(head, 30);
    
        cout << "Linked List after inserting at head: ";
        printList(head);
    
        return 0;
    }
    
    #include <iostream>
    using namespace std;
    
    // Node structure
    class Node {
    public:
        int data;
        Node* next;
    
        Node(int data) {
            this->data = data;
            this->next = NULL;
        }
    };
    
    // Insert at tail function
    void insertAtTail(Node* &head, int data) {
        Node* newNode = new Node(data);
    
        if (head == NULL) { // If list is empty
            head = newNode;
            return;
        }
    
        Node* temp = head;
        while (temp->next != NULL) { // Traverse to last node
            temp = temp->next;
        }
        temp->next = newNode; // Link last node to new node
    }
    
    // Print linked list
    void printList(Node* head) {
        Node* temp = head;
        while (temp != NULL) {
            cout << temp->data << " -> ";
            temp = temp->next;
        }
        cout << "NULL" << endl;
    }
    
    // Main function
    int main() {
        Node* head = NULL; // empty list
    
        insertAtTail(head, 10);
        insertAtTail(head, 20);
        insertAtTail(head, 30);
    
        cout << "Linked List after inserting at tail: ";
        printList(head);
    
        return 0;
    }
    
    #include <iostream>
    using namespace std;
    
    struct Node {
        int data;
        Node* next;
    };
    
    // Delete node at given position (0-based index)
    Node* deleteAtPosition(Node* head, int position) {
        if (head == NULL)
            return head;
    
        // Case 1: Delete head node
        if (position == 0) {
            Node* temp = head;
            head = head->next;
            delete temp;
            return head;
        }
    
        Node* current = head;
    
        // Traverse to (position - 1)
        for (int i = 0; i < position - 1 && current->next != NULL; i++) {
            current = current->next;
        }
    
        // If position is valid
        if (current->next != NULL) {
            Node* temp = current->next;
            current->next = temp->next;
            delete temp;
        }
    
        return head;
    }
    Node* deleteByValue(Node* head, int value) {
        if (head == NULL)
            return head;
    
        // Case 1: Value at head
        if (head->data == value) {
            Node* temp = head;
            head = head->next;
            delete temp;
            return head;
        }
    
        Node* current = head;
    
        // Search for the value
        while (current->next != NULL && current->next->data != value) {
            current = current->next;
        }
    
        // If value found
        if (current->next != NULL) {
            Node* temp = current->next;
            current->next = temp->next;
            delete temp;
        }
    
        return head;
    }
    
    void deleteEntireList(Node*& head) {
        Node* current = head;
        while (current != NULL) {
            Node* temp = current;
            current = current->next;
            delete temp;
        }
        head = NULL;
    }
    

    FAQ : Linked List Coding Questions

    1. What is a linked list in simple words?

    A linked list is a data structure where elements are stored in separate nodes, and each node points to the next one instead of being stored in continuous memory.

    2. Why should I learn linked lists?

    Linked lists help you understand dynamic memory, pointers, and real-world data structure concepts that are important for coding interviews and advanced programming.

    3. What are the basic operations in a linked list?

    The basic operations include insertion, deletion, traversal, searching, and counting nodes in the list.

    4. Is a linked list better than an array?

    It depends on the use case. Linked lists are better for frequent insertions and deletions, while arrays are faster for accessing elements by index.

    5. What is a node in a linked list?

    A node is a single unit of a linked list that stores data and a pointer (or reference) to the next node.

    6. What is the difference between singly and doubly linked lists?

    A singly linked list points only to the next node, while a doubly linked list points to both the previous and the next nodes.

    7. Are linked list coding questions difficult for beginners?

    No, basic linked list questions are easy if you understand pointers and practice step by step with simple examples.

    8. Which language is best for learning linked lists?

    C and C++ are commonly used because they clearly show pointer concepts, but Java and Python are also good options.

    9. What are the most common linked list interview questions?

    Common questions include reversing a linked list, finding the middle node, detecting a loop, and deleting a node at a given position.

    10. How can I avoid mistakes while coding linked lists?

    Always check for null pointers, handle edge cases like empty lists, and test your code with small inputs.

    11. How much practice is needed to master linked lists?

    With regular practice for a few days and solving basic problems, you can become comfortable with linked list concepts.

    12. Are linked lists still used in real projects?

    Yes, linked lists are used internally in operating systems, memory management, and many software libraries.

    Read More : FPGA Interview Questions & Answers