Data Structures

Linked List

Linear data structure where elements are connected using pointers.

Linked List Basics

A linked list is a linear data structure where elements are stored in nodes, and each node contains data and a pointer to the next node.

Types of Linked Lists

  • Singly Linked List - Each node points to next node
  • Doubly Linked List - Each node points to next and previous
  • Circular Linked List - Last node points to first
Singly Linked List:
[Data|Next] --> [Data|Next] --> [Data|Next] --> NULL
                    

Singly Linked List

singly_linked_list.c
#include 
#include 

typedef struct Node {
    int data;
    struct Node* next;
} Node;

// Create new node
Node* createNode(int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

// Insert at beginning
void insertAtBeginning(Node** head, int data) {
    Node* newNode = createNode(data);
    newNode->next = *head;
    *head = newNode;
}

// Insert at end
void insertAtEnd(Node** head, int data) {
    Node* newNode = createNode(data);
    if (*head == NULL) {
        *head = newNode;
        return;
    }
    Node* temp = *head;
    while (temp->next != NULL)
        temp = temp->next;
    temp->next = newNode;
}

// Delete node
void deleteNode(Node** head, int key) {
    Node* temp = *head, *prev = NULL;
    
    if (temp != NULL && temp->data == key) {
        *head = temp->next;
        free(temp);
        return;
    }
    
    while (temp != NULL && temp->data != key) {
        prev = temp;
        temp = temp->next;
    }
    
    if (temp == NULL) return;
    
    prev->next = temp->next;
    free(temp);
}

// Print list
void printList(Node* head) {
    while (head != NULL) {
        printf("%d -> ", head->data);
        head = head->next;
    }
    printf("NULL\n");
}

int main() {
    Node* head = NULL;
    
    insertAtEnd(&head, 10);
    insertAtEnd(&head, 20);
    insertAtBeginning(&head, 5);
    
    printf("Linked List: ");
    printList(head);
    
    deleteNode(&head, 20);
    printf("After deleting 20: ");
    printList(head);
    
    return 0;
}

Complexity Analysis

OperationTime ComplexitySpace Complexity
Insert at beginningO(1)O(1)
Insert at endO(n)O(1)
DeleteO(n)O(1)
SearchO(n)O(1)

Doubly Linked List

doubly_linked_list.c
#include 
#include 

typedef struct DNode {
    int data;
    struct DNode* prev;
    struct DNode* next;
} DNode;

// Create new node
DNode* createDNode(int data) {
    DNode* newNode = (DNode*)malloc(sizeof(DNode));
    newNode->data = data;
    newNode->prev = NULL;
    newNode->next = NULL;
    return newNode;
}

// Insert at beginning
void insertAtBeginning(DNode** head, int data) {
    DNode* newNode = createDNode(data);
    newNode->next = *head;
    if (*head != NULL)
        (*head)->prev = newNode;
    *head = newNode;
}

// Print forward
void printForward(DNode* head) {
    printf("Forward: ");
    while (head != NULL) {
        printf("%d ", head->data);
        head = head->next;
    }
    printf("\n");
}

// Print backward
void printBackward(DNode* head) {
    if (head == NULL) return;
    while (head->next != NULL)
        head = head->next;
    
    printf("Backward: ");
    while (head != NULL) {
        printf("%d ", head->data);
        head = head->prev;
    }
    printf("\n");
}

int main() {
    DNode* head = NULL;
    
    insertAtBeginning(&head, 30);
    insertAtBeginning(&head, 20);
    insertAtBeginning(&head, 10);
    
    printForward(head);
    printBackward(head);
    
    return 0;
}

Circular Linked List

In a circular linked list, the last node points back to the first node, forming a circle.

Circular Linked List:
[Data|Next] --> [Data|Next] --> [Data|Next] --+
      ^                                        |
      +----------------------------------------+