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;
}
We use two pointers (slow & fast).
Move fast n steps ahead
Then move both together
When fast reaches the end:
👉 slow is just before the node to delete
So we simply remove slow->next.
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;
}