So when ReadListBackward(4) returns, the control goes to ReadListBackward(3).
Correct. The program resumes at

Code:
printf("%d\n", head->data);
as this is ReadListBackward(3) then head->data is 3 and hence 3 is printed. When a function calls itself it re-enters the function and creates a new set of non-static variables. When the function exits, it goes back to the place in the function from which it was called with the same variable values that existed in the function before the call. This is called function recursion.

You might find this useful
http://www.dcs.bbk.ac.uk/~roger/cpp/week15.htm