The easiest algorithm I can think of might not be the most efficient. But it's not horrifically slow, either, and should be particularly easy to understand, to implement, and to adjust. It should also give you more than sufficient quality with little mental effort.
The overall process is to simply iterate over all of the voxels within the cube that will contain the planet; the usual three nested for-loops will do. Given a center point cp = (cx, cy, cz) and a radius r, that would be the cube from (cx - r, cy - r, cz - r) to (cx + r, cy + r, cz + r), inclusive.
Inside that innermost loop, for each voxel, calculate the distance from the voxel's point vp = (vx, vy, vz) to the center of the planet using the standard formula for Euclidean distance: d = sqrt((cx - vx)2 + (cy - vy)2 + (cz - vz)2). Based on that distance, determine what type of block you want. Small distances will be the solid or molten core. Medium distances will be the mantle. Distances just slightly less than the radius will be the crust and surface bits. Anything larger than the radius will remain empty.
You'll need to make each layer thick enough to guarantee that layers aren't strangely spotty, but as long as your planets aren't low resolution (like 9 voxels wide or something), you should have plenty of room to work with. Just don't make your crust as thin as it would realistically be, because you won't have enough voxel resolution to make it work, and you'll end up with a bunch of the mantle showing everywhere.
Beyond that caveat, it should be pretty easy to adjust the radius at which each layer ends, you'll get a nearly perfect sphere, and there won't be any accidental gaps inside the planet. Trying to build the planet up layer by layer might seem intuitive, but it actually makes the process way harder than it needs to be, once you get into the implementation. However, if you want to guarantee that the crust is only one voxel thick, it would probably be sufficient to do the above generation without the crust, and then just add a single layer of the crust on top of the mantle. (Setting any voxel that is empty but adjacent to a mantle voxel would work.)
"We should have a great fewer disputes in the world if words were taken for what they are, the signs of our ideas only, and not for things themselves." - John Locke