Remove Nth node from End of the List

Given the head of a linked list, remove the nth node from the end of the list and return its head.
So the given linked list is and n = 2, need to remove 2nd node from the end of the Linked List.
Assets/Leetcode/LinkedList/remove_nth_node_from_end/1.png
From the end of the list [4] is the desired Nth Node. After removing the nth node, the final Linked List will look like this.
Assets/Leetcode/LinkedList/remove_nth_node_from_end/2.png

Intuition

If you already solved Delete the Middle node of a Linked List, You already know that to remove a node from Linked List, we must need it's the previous/left node and next/right node to do something like this
Assets/Leetcode/LinkedList/remove_nth_node_from_end/3.png
Here is Left Node [3] is breaking link with the desired Nth Node [4] and establishing connection with it's next node [5].
🤔 But how can we determine that we have reached at the node before Nth Node?
Well we need another pointer Right and move both Left and Right pointer in such a way that by the time Right pointer reaches at NULL the Left pointer reaches at the Node before Nth Node. Let's visualize it first.
Assets/Leetcode/LinkedList/remove_nth_node_from_end/4.png
So basically, there must be N Number of Nodes in between Left and Right pointer.

Pointer Placement

First Place the Right at the Head and move it N Nodes Forward.
Assets/Leetcode/LinkedList/remove_nth_node_from_end/5.png
Now run N iterations from the Head to move Right pointer forward.
Assets/Leetcode/LinkedList/remove_nth_node_from_end/6.png
Let's write a Helper Function for this

def getNodeInNthDistance(self, ptr: Optional[ListNode], n: int) -> Optional[ListNode]:
	while ptr and n > 0:
		ptr = ptr.next
		n -= 1
	return ptr

Let's place the Left pointer before N nodes from the Right.
To do so, initialize a Dummy Node and attach it with the Head. Then put the Left pointer on the Dummy Head. Let's visualize
Assets/Leetcode/LinkedList/remove_nth_node_from_end/7.png
Awesome, we placed our Left and Right pointer in such a way that there are N nodes in between them.

# Definition for singly-linked list.
# class ListNode:
	# def __init__(self, val=0, next=None):
	# self.val = val
	# self.next = next

def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
	dummy = ListNode(next=head)
	left = dummy
	right = self.getNodeInNthDistance(head, n)

Now let's forward both of the pointer one node at a time until the Right pointer reaches at NULL
Assets/Leetcode/LinkedList/remove_nth_node_from_end/8.png

while right:
	left = left.next
	right = right.next

Now the Right pointer has reached at NULL and the Left pointer has reached at the Node before Nth Node from the End. Now connect Left node with it's next of next node.
Assets/Leetcode/LinkedList/remove_nth_node_from_end/9.png
left.next = left.next.next
That's it, let's write the whole code.

Complete Code Snippet

class Solution:
	def getNodeInNthDistance(self, ptr: Optional[ListNode], n: int) -> Optional[ListNode]:
		while ptr and n > 0:
			ptr = ptr.next
			n -= 1
		return ptr
	def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
		dummy = ListNode(next=head)
		left = dummy
		right = self.getNodeInNthDistance(head, n)
		
		while right:
			left = left.next
			right = right.next
		
		# connect left with next of it's next node
		left.next = left.next.next
		return dummy.next

Thanks for Stopping by! Happy Leet coding

Connect with me on

Github LinkedIn Gmail Youtube