Tag: singly linked list

  • 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

  • Linked List Explained: Master Complete Guide for Beginners 2026

    Introduction to Linked List

    If you’re learning Linked List data structures, you’ve probably come across the term Linked List. But what exactly is it? How does it work, and why do we even need it when we already have arrays?

    In this blog post, we’ll dive deep into linked list in data structure, understand how it differs from other data structures, explore the types of linked list, and learn about their practical advantages and use cases.

    What is a Linked List?

    A Linked List is a linear data structure where elements are stored in nodes, and each node points to the next one in the sequence. Unlike arrays, which store elements in contiguous memory locations, linked lists store data non-contiguously and use pointers to connect elements.

    Each node in a linked list contains:

    • Data (the value stored in the node)
    • Pointer (or reference) to the next node

    This unique structure makes linked lists highly flexible and efficient in certain scenarios.

    Why Use Linked List Instead of Arrays?

    Before diving into the types of linked list, let’s quickly understand why we’d choose a linked list over an array:

    ✅ Dynamic Size: Unlike arrays, linked lists don’t require specifying size in advance. Nodes can be added or removed without reallocating memory.

    ✅ Efficient Insertions/Deletions: Adding or removing elements doesn’t involve shifting elements, as in arrays.

    ✅ Memory Utilization: Useful when memory is fragmented or when the size of the dataset changes frequently.

    However, linked lists also have some disadvantages, like higher memory usage due to storing pointers and slower random access.

    Types of Linked List

    There are several types of linked list, each serving different use cases:

    1. Singly Linked List

    • Each node has a reference to the next node only.
    • Traversal is possible only in one direction.
    • Simple and widely used in basic implementations.

    Example:

    [10] → [20] → [30] → NULL
    

    2. Doubly Linked List

    • Each node has references to both next and previous nodes.
    • Allows traversal in both directions (forward and backward).
    • Slightly higher memory usage due to the extra pointer.

    Example:

    NULL ← [10] ↔ [20] ↔ [30] → NULL
    

    3. Circular Linked List

    • Last node points back to the first node, creating a circle.
    • Can be singly or doubly linked.
    • Useful in applications like round-robin scheduling.

    Example:

    [10] → [20] → [30] → [10] …
    

    Common Linked List Operations

    Understanding basic linked list operations is crucial. Let’s look at the most common:

    Insertion

    • Insert a new node at the beginning, middle, or end of the list.

    Deletion

    • Remove a node based on value or position.

    Traversal

    • Visit each node and perform an action (like printing values).

    Searching

    • Find whether a particular value exists in the linked list.

    Advantages of Linked List

    Let’s recap some advantages of linked list:

    • Dynamic memory allocation
    • No wasted memory (no predefined size)
    • Easier insertion/deletion
    • Useful for implementing stacks, queues, graphs, and more

    Applications of Linked List

    Here are some practical uses of linked list in data structure:

    • Implementing stacks and queues
    • Dynamic memory management
    • Browser history (back and forward functionality)
    • Undo/redo features in software
    • Hash table chaining

    Linked List vs Array: Quick Comparison

    FeatureArrayLinked List
    SizeFixedDynamic
    Memory AllocationContiguousNon-contiguous
    Insertion/DeletionCostly (shifting)Efficient
    Random AccessO(1)O(n)

    Conclusion

    A Linked List is a powerful and flexible data structure essential for any programmer’s toolkit. While it might seem complex initially, it offers significant advantages, especially when dealing with dynamic data and frequent insertions or deletions.

    Whether you’re preparing for coding interviews or simply expanding your programming knowledge, mastering linked list in data structure will give you a strong foundation for solving complex problems efficiently.

    Frequently Asked Questions (FAQ)

    Q1. What is a linked list in simple words?
    A linked list is a sequence of nodes where each node points to the next, making it easy to add or remove elements without shifting other data.

    Q2. Is linked list better than array?
    It depends. Linked lists are better for frequent insertions/deletions, but arrays are better for fast random access.

    Q3. What are the types of linked list?
    The main types include singly linked list, doubly linked list, and circular linked list.

    Q4. Where is linked list used in real life?
    Linked lists are used in browser history, memory management, music playlists, and many other applications.