Welcome to Subscribe On Youtube

19. Remove Nth Node From End of List

Description

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?

Solutions

Solution 1: Fast and Slow Pointers

We define two pointers fast and slow, both initially pointing to the dummy head node of the linked list.

Next, the fast pointer moves forward $n$ steps first, then fast and slow pointers move forward together until the fast pointer reaches the end of the linked list. At this point, the node pointed to by slow.next is the predecessor of the $n$-th node from the end, and we can delete it.

The time complexity is $O(n)$, where $n$ is the length of the linked list. The space complexity is $O(1)$.

  • /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode() {}
     *     ListNode(int val) { this.val = val; }
     *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
     * }
     */
    class Solution {
        public ListNode removeNthFromEnd(ListNode head, int n) {
            ListNode dummy = new ListNode(0, head);
            ListNode fast = dummy, slow = dummy;
            while (n-- > 0) {
                fast = fast.next;
            }
            while (fast.next != null) {
                slow = slow.next;
                fast = fast.next;
            }
            slow.next = slow.next.next;
            return dummy.next;
        }
    }
    
  • /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode() : val(0), next(nullptr) {}
     *     ListNode(int x) : val(x), next(nullptr) {}
     *     ListNode(int x, ListNode *next) : val(x), next(next) {}
     * };
     */
    class Solution {
    public:
        ListNode* removeNthFromEnd(ListNode* head, int n) {
            ListNode* dummy = new ListNode(0, head);
            ListNode* fast = dummy;
            ListNode* slow = dummy;
            while (n--) {
                fast = fast->next;
            }
            while (fast->next) {
                slow = slow->next;
                fast = fast->next;
            }
            slow->next = slow->next->next;
            return dummy->next;
        }
    };
    
  • # 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]:
            dummy = ListNode(next=head)
            fast = slow = dummy
            for _ in range(n):
                fast = fast.next
            while fast.next:
                slow, fast = slow.next, fast.next
            slow.next = slow.next.next
            return dummy.next
    
    
  • /**
     * Definition for singly-linked list.
     * type ListNode struct {
     *     Val int
     *     Next *ListNode
     * }
     */
    func removeNthFromEnd(head *ListNode, n int) *ListNode {
    	dummy := &ListNode{0, head}
    	fast, slow := dummy, dummy
    	for ; n > 0; n-- {
    		fast = fast.Next
    	}
    	for fast.Next != nil {
    		slow, fast = slow.Next, fast.Next
    	}
    	slow.Next = slow.Next.Next
    	return dummy.Next
    }
    
  • /**
     * Definition for singly-linked list.
     * class ListNode {
     *     val: number
     *     next: ListNode | null
     *     constructor(val?: number, next?: ListNode | null) {
     *         this.val = (val===undefined ? 0 : val)
     *         this.next = (next===undefined ? null : next)
     *     }
     * }
     */
    
    function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null {
        const dummy = new ListNode(0, head);
        let fast = dummy;
        let slow = dummy;
        while (n--) {
            fast = fast.next;
        }
        while (fast.next) {
            slow = slow.next;
            fast = fast.next;
        }
        slow.next = slow.next.next;
        return dummy.next;
    }
    
    
  • /**
     * Definition for singly-linked list.
     * function ListNode(val, next) {
     *     this.val = (val===undefined ? 0 : val)
     *     this.next = (next===undefined ? null : next)
     * }
     */
    /**
     * @param {ListNode} head
     * @param {number} n
     * @return {ListNode}
     */
    var removeNthFromEnd = function (head, n) {
        const dummy = new ListNode(0, head);
        let fast = dummy,
            slow = dummy;
        while (n--) {
            fast = fast.next;
        }
        while (fast.next) {
            slow = slow.next;
            fast = fast.next;
        }
        slow.next = slow.next.next;
        return dummy.next;
    };
    
    
  • # Definition for singly-linked list.
    # class ListNode
    #     attr_accessor :val, :next
    #     def initialize(val = 0, _next = nil)
    #         @val = val
    #         @next = _next
    #     end
    # end
    # @param {ListNode} head
    # @param {Integer} n
    # @return {ListNode}
    def remove_nth_from_end(head, n)
      dummy = ListNode.new(0, head)
      fast = slow = dummy
      while n > 0
          fast = fast.next
          n -= 1
      end
      while fast.next
          slow = slow.next
          fast = fast.next
      end
      slow.next = slow.next.next
      return dummy.next
    end
    
  • // Definition for singly-linked list.
    // #[derive(PartialEq, Eq, Clone, Debug)]
    // pub struct ListNode {
    //   pub val: i32,
    //   pub next: Option<Box<ListNode>>
    // }
    //
    // impl ListNode {
    //   #[inline]
    //   fn new(val: i32) -> Self {
    //     ListNode {
    //       next: None,
    //       val
    //     }
    //   }
    // }
    impl Solution {
        pub fn remove_nth_from_end(head: Option<Box<ListNode>>, n: i32) -> Option<Box<ListNode>> {
            let mut dummy = Some(Box::new(ListNode { val: 0, next: head }));
            let mut slow = &mut dummy;
            let mut fast = &slow.clone();
            for _ in 0..=n {
                fast = &fast.as_ref().unwrap().next;
            }
            while fast.is_some() {
                fast = &fast.as_ref().unwrap().next;
                slow = &mut slow.as_mut().unwrap().next;
            }
            slow.as_mut().unwrap().next = slow.as_mut().unwrap().next.as_mut().unwrap().next.take();
            dummy.unwrap().next
        }
    }
    
    
  • # Definition for singly-linked list.
    # class ListNode {
    #     public $val;
    #     public $next;
    
    #     public function __construct($val = 0, $next = null)
    #     {
    #         $this->val = $val;
    #         $this->next = $next;
    #     }
    # }
    
    class Solution {
        /**
         * @param ListNode $head
         * @param int $n
         * @return ListNode
         */
    
        function removeNthFromEnd($head, $n) {
            $dummy = new ListNode(0);
            $dummy->next = $head;
    
            $first = $dummy;
            $second = $dummy;
    
            for ($i = 0; $i <= $n; $i++) {
                $second = $second->next;
            }
    
            while ($second != null) {
                $first = $first->next;
                $second = $second->next;
            }
    
            $first->next = $first->next->next;
    
            return $dummy->next;
        }
    }
    
    

All Problems

All Solutions