Every bitcoin is locked by output script. Only when the result of output script returns true, bitcoin is allowed to spend.
In your case first bitcoins are locked with Alice's private key. Which means output script will return true only if Alice had signed the transaction with her private key. Alice signs the transaction with her private key to Bob's public key, and this will unlock the bitcoin as Alice has provided her private key and new output script will be generated for this bitcoin, which can be unlocked by Bob's private key.
Now, when Bob wants to spend bitcoin which is locked by his private key, he can sign the transaction with his private key to Charlie's public key.
"...and new output script will be generated for this bitcoin, which can be unlocked by Bob's private key." - So basically you don't need a privet key in order to lock (sign) a message? – Arik Malachi – 2018-01-14T20:47:16.003
Yeah. To lock bitcoin you only need public key. To unlock you have to pass your signature which is signed by your private key. – Preet – 2018-01-14T20:55:13.270