docs: @CanIgnoreReturnValue
    private Node<K, V> addNode(@Nullable K key, @Nullable V value, @Nullable Node<K, V> nextSibling) {
      Node<K, V> node = new Node<K, V>(key, value);
      if (head == null) { // empty list
        head = tail = node;
        keyToKeyList.put(key, new KeyList<K, V>(node));
        modCount++;
      } else if (nextSibling == null) { // non-empty list, add to tail
        tail.next = node;
        node.previous = tail;
        tail = node;
        KeyList<K, V> keyList = keyToKeyList.get(key);
        if (keyList == null) {
          keyToKeyList.put(key, keyList = new KeyList<K, V>(node));
          modCount++;
        } else {
          keyList.count++;
          Node<K, V> keyTail = keyList.tail;
          keyTail.nextSibling = node;
          node.previousSibling = keyTail;
          keyList.tail = node;
        }
      } else { // non-empty list, insert before nextSibling
        KeyList<K, V> keyList = keyToKeyList.get(key);
        keyList.count++;
        node.previous = nextSibling.previous;
        node.previousSibling = nextSibling.previousSibling;
        node.next = nextSibling;
        node.nextSibling = nextSibling;
        if (nextSibling.previousSibling == null) { // nextSibling was key head
          keyToKeyList.get(key).head = node;
        } else {
          nextSibling.previousSibling.nextSibling = node;
        }
        if (nextSibling.previous == null) { // nextSibling was head
          head = node;
        } else {
          nextSibling.previous.next = node;
        }
        nextSibling.previous = node;
        nextSibling.previousSibling = node;
      }
      size++;
      return node;
    }