Implement queue with a linked list; why would it be bad to insert at the head and remove at the tail?
In a single linked list, every element has a pointer to the next element.  If you have an additional pointer to the tail element, it takes you a constant number og operations to add to the list at the tail:  get the tail pointer, add an element after the tail, put this new element as new tail.  Removing from the head also takes a constant number of operations:  make you new item new, head, point to old head.

However, removing from the tail demands a pointer to the predecessor to the current tail.  This takes you as many operations as there are elements, namely linearly many.

Another solution is to use a doubly linked list, then you can choose what you will, but it uses twice as much memory.