Он возвращает, может ли оператор оценивать значение false. например:
!false // true
!true // false
!isValid() // is not valid
Вы можете использовать его дважды, чтобы принудить значение к boolean:
!!1 // true
!!0 // false
Итак, чтобы более точно ответить на ваш вопрос:
var myVar = !function(){ return false; }(); // myVar contains true
Редактировать: он имеет побочный эффект изменения объявления функции в выражении функции. Например. следующий код недействителен, поскольку он интерпретируется как объявление функции, в котором отсутствует требуемый идентификатор (или имя функции ):
function () { return false; }(); // syntax error
Я немного изменил ваш метод add () и метод toString ():
public void add(E value) {
if (first == null) {
first = new Node(value, null, null);
} else {
Node current = first;
while (current.next != null) {
current = current.next;
}
current.next = new Node(value, null, current);
}
size++;
}
public String toString()
{
if (first == null)
{
return "[]";
}
else
{
String result = "[" + first.data;
Node current = first.next;
while (current != null)
{
result += ", " +current.data ;
current = current.next;
}
result += "]";
return result;
}
}
И вот главное для проверки:
public static void main(String[] args) {
DoublyLinkedList<Integer> list = new DoublyLinkedList<>();
list.add(1);
list.add(2);
list.add(3);
System.out.println(list.toString()); // [1, 2, 3]
}
Я допустил некоторые незначительные ошибки в своем коде выше, поэтому я понял, я собираюсь опубликовать свой ответ.
@SuppressWarnings("unchecked")
public String toString()
{
if (isEmpty())
{
return "[]";
}
else
{
String result = "[" + first.data;
Node current = first.next;
for(int i = 0; i < size-1; i++)
{
result += ", " + current.data;
current = current.next;
}
result += "]";
return result;
}
}