1. Insertion (all types)

  ListNode *insertAtHead(ListNode *&head, int X)
    {
        ListNode *node = new ListNode(X);
        if (!head)
            return node;

        node->next = head;
        return node;
    }
    ListNode* insertAtTail(ListNode* &head, int X) {
        ListNode* node = new ListNode(X);
        if(!head) return node;

        ListNode* temp = head;

        while(temp->next){
            temp=temp->next;
        }
        temp->next = node;
        return head;
    }
    ListNode* insertAtKthPosition(ListNode* &head, int X, int k) {
        if(head==NULL){
            if(k==1) return new ListNode(X);
            return head;
        }
        if(k==1) return new ListNode(X,head);
        int cnt = 0;
        ListNode* temp = head;
        while(temp)
        {
            cnt++;
            if(cnt==k-1){
                ListNode* node = new ListNode(X,temp->next);
                temp->next = node;
                break;
            }
            temp=temp->next;
        }
        return head;
    }
    ListNode* insertBeforeX(ListNode* &head, int X, int val) {
        if(head==NULL){
            return head;
        }
        if(head->val == X) return new ListNode(val,head);
        ListNode* temp = head;
        while(temp->next){
            if(temp->next->val == X){
                ListNode* node = new ListNode(val,temp->next);
                temp->next = node;
                break;
            }
            temp=temp->next;
        }
        return head;
    }

2. Remove Nth node from back of Linked List

We use two pointers (slow & fast).

  1. Move fast n steps ahead

  2. Then move both together

  3. When fast reaches the end:

    👉 slow is just before the node to delete

So we simply remove slow->next.

🧩 Special case

If fast becomes NULL after moving n steps

👉 it means we have to delete the head node

 ListNode* removeNthFromEnd(ListNode* head, int n) {
        if(!head) return head;

        ListNode* slow = head;
        ListNode* fast = head;

        for(int i=1;i<=n;i++) fast=fast->next;

        if(!fast){
            ListNode* temp = head;
            head=head->next;
            delete temp;
            return head;
        }

        while(fast->next){
            slow=slow->next;
            fast=fast->next;
        }   

        ListNode* temp = slow->next;
        slow->next = slow->next->next;
        delete temp;
        return head;
    }