Array access by index is direct, so $\texttt{get_at(i)}$ is $O(1)$.
But inserting at the beginning of an array needs shifting, so it is $O(n)$.
In a singly linked list, accessing the $i$-th node needs traversal, so it is $O(n)$.
Inserting or deleting the first node only changes the $\texttt{head}$ pointer, so both are $O(1)$
Without a $\texttt{tail}$ pointer, inserting at the end needs traversal, so it is $O(n)$.