use recursive process so we do not need to handle reversed list specially
2.21-29