public static int Run(int[] nums, int limit)
    {
        if (nums == null)
        {
            return(0);
        }

        var maxDeque = new System.Collections.Generic.LinkedList <int>();
        var minDeque = new System.Collections.Generic.LinkedList <int>();

        int res = 1;

        int l = 0;

        // find the longest subarray for every right pointer by shrinking left pointer
        for (int r = 0; r < nums.Length; ++r)
        {
            // update maxDeque with new right pointer
            while (maxDeque.Count != 0 && maxDeque.Last.Value < nums[r])
            {
                maxDeque.RemoveLast();
            }
            maxDeque.AddLast(nums[r]);

            // update minDeque with new right pointer
            while (minDeque.Count != 0 && minDeque.Last.Value > nums[r])
            {
                minDeque.RemoveLast();
            }
            minDeque.AddLast(nums[r]);

            // shrink left pointer if exceed limit
            while (maxDeque.First.Value - minDeque.First.Value > limit)
            {
                if (maxDeque.First.Value == nums[l])
                {
                    maxDeque.RemoveFirst();
                }
                if (minDeque.First.Value == nums[l])
                {
                    minDeque.RemoveFirst();
                }
                ++l;  // shrink it!
            }

            // update res
            res = Math.Max(res, r - l + 1);
        }

        return(res);
    }
 public static int Pop(System.Collections.Generic.LinkedList <int> myLList)
 {
     System.Collections.Generic.LinkedListNode <int> elementeDeleted;
     if (myLList.Count == 0)
     {
         return(0);
     }
     else
     {
         elementeDeleted = myLList.First;
         myLList.RemoveFirst();
         return(elementeDeleted.Value);
     }
 }