19. Remove Nth Node From End of List

Medium


Given the head of a linked list, remove the nth node from the end of the list and return its head.

 

Example 1:

Input: head = [1,2,3,4,5], n = 2
Output: [1,2,3,5]

Example 2:

Input: head = [1], n = 1
Output: []

Example 3:

Input: head = [1,2], n = 1
Output: [1]

 

Constraints:

  • The number of nodes in the list is sz.
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

 

Follow up: Could you do this in one pass?





 # Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
#         size = 0
#         node = head
#         while node:
#             size+=1
#             node = node.next

#         node = head
#         target_node_position = size - n 

#         # head
#         if target_node_position == 0:
#             return head.next

#         target_node_position -=1

#         # head is removed, now the rest of them
#         for i in range(target_node_position+1):
#             if i == target_node_position:
#                 node.next = node.next.next
#             node = node.next

#         return head 

         # two pointer approach
        current_node = head
        for i in range(n):
            current_node=current_node.next

        if current_node is None:
            return head.next

        node_before_remove = head

        while current_node.next is not None:
            current_node = current_node.next
            node_before_remove = node_before_remove.next


        node_before_remove.next = node_before_remove.next.next

        return head

Random Note


From python 3.7 dict guarantees that order will be kept as they inserted, and popitem will use LIFO order but we need FIFO type system. so we need OrderedDict which have popIten(last = T/F) for this req. One thing, next(iter(dict)) will return the first key of the dict