For remove last we run into another efficiency problem. For the list below, start references the first Node (with data 3) and last references the last Node (with data 15).

But to remove 15, we need a reference to the previous Node (with value 10) so that last can point to it and its .next field can be set to null.
We could write a loop to begin at start again and move a Node variable p down to point to the next to last Node (with value 10 in this case). But that would make the running time of this operation depend on the current length of the list.
We could do this, but a better idea is to be able to move to the previous Node as well as the next Node just as i++ or i-- lets us move to the next or previous index in an array.