General
Default Values
Java uses default values for all its fields. Meaning :
public Node(){
item = null;
next = null;
}
public Node(){ item = null; next = null; }
Does nothing except takestake up space for you. I would remove it, and the other lines / constructors like it). Some consider it bad practice to rely on the default values, you can then explicitly state the default value of a field on the same row as you are declaring it.
private Node head = null;
Inconsistency
You are inconsistent at spacing your code. I also recommend having fields at the right below the class declaration. I should not have to look for the fields, I want to find them instantly.
Bug in remove, insertBefore
If head is null, then current.next will throw a NullPointerException. I suggest guarding against null for head first in the method.
if (head == null) {
System.out.println ("Item doesn't exist in the list.");
return;
}
Nitpicks
public void add(T item)
You always execute the size++; why have it in two different places? And not directly under Node p = new Node (item);
public boolean isEmpty()
Looks perfect, why can't every method turn out to be like this? One option is to match against head == null as well, however in terms micro-optimization, it is slower.
public int getSize()
Nothing needs to be said, a simple getter.
public void remove(T item)
Instead of letting it handle the error printing, let remove return a boolean, true if removed, false if not, making it more flexible to use in future applications.