Remove Nodes From Linked List

medium linked list monotonic stack

Problem

You are given the head of a singly linked list. Delete every node that has a strictly greater value somewhere to its right, and return the head of what remains. The list holds up to 10⁵ nodes with values between 1 and 10⁵.

Inputhead = 5 → 2 → 13 → 3 → 8
Output13 → 8
5, 2 and 3 each have a greater value (13 or 8) somewhere to their right, so they are removed; 13 and 8 do not.

def remove_nodes(head):
    stack = []
    node = head
    while node:
        while stack and stack[-1].val < node.val:
            stack.pop()
        stack.append(node)
        node = node.next
    for i in range(len(stack) - 1):
        stack[i].next = stack[i + 1]
    stack[-1].next = None
    return stack[0]
function removeNodes(head) {
  const stack = [];
  for (let node = head; node; node = node.next) {
    while (stack.length && stack[stack.length - 1].val < node.val) {
      stack.pop();
    }
    stack.push(node);
  }
  for (let i = 0; i + 1 < stack.length; i++) {
    stack[i].next = stack[i + 1];
  }
  stack[stack.length - 1].next = null;
  return stack[0];
}
ListNode removeNodes(ListNode head) {
    Deque<ListNode> stack = new ArrayDeque<>();
    for (ListNode node = head; node != null; node = node.next) {
        while (!stack.isEmpty() && stack.peek().val < node.val) {
            stack.pop();
        }
        stack.push(node);
    }
    ListNode next = null;
    while (!stack.isEmpty()) {
        ListNode cur = stack.pop();
        cur.next = next;
        next = cur;
    }
    return next;
}
ListNode* removeNodes(ListNode* head) {
    vector<ListNode*> stack;
    for (ListNode* node = head; node; node = node->next) {
        while (!stack.empty() && stack.back()->val < node->val) {
            stack.pop_back();
        }
        stack.push_back(node);
    }
    for (int i = 0; i + 1 < (int)stack.size(); i++) {
        stack[i]->next = stack[i + 1];
    }
    stack.back()->next = nullptr;
    return stack[0];
}
Time: O(n) Space: O(n)