#include <stdio.h>
#include <stdlib.h>
struct ListNode
{
    struct ListNode *next;
    char ch;
};
void
printList(const struct ListNode *listNode)
{
    for (; listNode; listNode = listNode->next) {
        putchar(listNode->ch);
    }
}
void
printListReverse(const struct ListNode *listNode)
{
    if (!listNode) {
        return;
    }
    printListReverse(listNode->next);
    putchar(listNode->ch);
}
int
main(void)
{
    // begin with empty list
    struct ListNode *list = 0;
    char ch;
    while ((ch = getchar()) != '\n') {
        struct ListNode *p = malloc(sizeof(*p));
        // normally we would check if p is the null pointer
        // prepend to current list
        p->next = list;
        p->ch = ch;
        list = p;
    }
    printf("calling: printList(list)\n");
    printList(list);
    putchar('\n');
    printf("calling: printListReverse(list)\n");
    printListReverse(list);
    putchar('\n');
}