2487. Remove Nodes From Linked List

Medium
You are given the head of a linked list.
Remove every node which has a node with a strictly greater value anywhere to the right side of it.
Return the head of the modified linked list.
Example 1:
​
​
Input: head = [5,2,13,3,8]
Output:
[13,8]
Explanation:
The nodes that should be removed are 5, 2 and 3.
- Node 13 is to the right of node 5.
- Node 13 is to the right of node 2.
- Node 8 is to the right of node 3.
Example 2:
Input: head = [1,1,1,1]
Output:
[1,1,1,1]
Explanation:
Every node has value 1, so no nodes are removed.
Constraints:
  • The number of the nodes in the given list is in the range [1, 105].
  • 1 <= Node.val <= 10^5

解題

先用 stack 消去比 head 小的節點,接著將 stack 內剩下的節點連在一起。
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func removeNodes(head *ListNode) *ListNode {
stack := make([]*ListNode, 0)
​
for head != nil {
for len(stack) != 0 {
top := stack[len(stack) - 1]
if top.Val < head.Val {
stack = stack[:len(stack) - 1]
} else {
break
}
}
stack = append(stack, head)
head = head.Next
}
​
for i:=0; i<len(stack) - 1; i++ {
stack[i].Next = stack[i + 1]
}
​
return stack[0]
}