Python 3, 161 bytes
l=len lambda p:''.join(['+'*(i>0)*(c>0)+(str(c)[:-1],str(c))[abs(c)-1or i==l(p)-1]+'x'*(i!=l(p)-1)+('^%d'%(l(p)+~i))*(i<l(p)-2)for i,c in enumerate(p)if c])or'0' Expanded:
l=len # Alias the len function since we use it a lot lambda p: ''.join([ # Join a list of strings '+'*(i>0)*(c>0) # Prepend a + if this isn't the first term and the coefficient is positive + (str(c)[:-1], str(c))[abs(c) - 1 or i == l(p) - 1] # If the coefficient is 1 and this isn't the last term, delete the '1' from the string representation, otherwise just use the string representation + 'x' * (i != l(p) - 1) # If this isn't the last term, append an x + ('^%d' % (l(p) + ~i)) * (i < l(p) - 2) # If this isn't one of the last two terms, append the exponent for i, c in enumerate(p) if c]) # Iterating over each coefficient with its index, discarding the term if the coefficient is zero or '0' # If all of the above resulted in an empty string, replace it with '0'