public boolean insertAfter(int data, int k) { // insert data after DNode w/data k

    if (head == null) {
      return false;
    }

    DNode current = head;
    while (current.getData() != k) {

      current = current.getNext();
      if (current == null) {
        return false; // didn't find k
      }
    }
    // insert after current Node
    DNode insertingNode = new DNode(data);

    if (current.getNext() == null) { // is current the last Node?
      current.setNext(insertingNode);
      insertingNode.setPrev(current);
      return true;
    }
    // not at last node
    DNode temp = current.getNext();
    current.setNext(insertingNode);
    insertingNode.setPrev(current);
    insertingNode.setNext(temp);
    temp.setPrev(insertingNode);

    // example:
    // if we are inserting after 2
    // 1<->2<->4<->5<->6
    // insertingNode = 3
    // temp = 4
    // in order: 2->3,    2<->3,   2<->3->4,   2<->3<->4, result: //1<->2<->3<->4<->5<->6
    return true;
  }
  public boolean delete(int data) {

    boolean isDeleted = false;

    if (head.getData() == data) {
      head.setNext(head);
      head.setPrev(null);
      isDeleted = true;
      return isDeleted;
    }

    DNode current = head;
    // 1 <-> 2 <-> 3 <-> 4 <-> 5
    while (current.getNext() != null) {

      if (current.getNext().getData() == data) {
        current.setNext(current.getNext().getNext());
        current.getNext().setPrev(current);
        isDeleted = true;
      }
      current = current.getNext();
    }
    return isDeleted;
  }
  public void insertAtEnd(int data) {

    DNode insertingNode = new DNode(data);

    if (head == null) {
      head = insertingNode;
    } else {
      DNode current = head;

      while (current.getNext() != null) {
        current = current.getNext();
      }
      current.setNext(insertingNode);
      insertingNode.setPrev(current);
    }
  }