#include <stdio.h>
#include <stdlib.h>

//第5回：線形リスト（Linked List）
//配列と違って、データを増やしたり減らしたりが簡単
//ノード（値＋次のノードへのポインタ）をつないでいく構造

//ノードの構造体（val と next の2つで1セット）
typedef struct node{
    int val;
    struct node *next;
}Node;

//head はリストの先頭を指す（絶対に見失わないこと）
Node *head = NULL;

//ノードを1個作る（値xで初期化）
Node* createN(int x){
    Node *p = (Node*)malloc(sizeof(Node));
    p->val = x;
    p->next = NULL; //末尾なので next はNULL
    return p;
}

//n個の値でリストを初期化（演習1）
void initL(int n){
    int x;
    scanf("%d", &x);
    head = createN(x); //最初のノード
    Node *p = head;

    for(int i = 1; i < n; i++){
        scanf("%d", &x);
        p->next = createN(x); //次のノードをつなぐ
        p = p->next; //ポインタを進める
    }
}

//リストを解放（freeL）
void freeL(){
    Node *p;
    while(head != NULL){
        p = head->next; //次を覚えておく
        free(head); //今のノードを解放
        head = p; //次へ進む
    }
}

//ノード1個を出力（NULLならNULLと出す）
void printN(Node *a){
    if(a == NULL) printf("NULL\n");
    else printf("%d\n", a->val);
}

//リスト全体を出力（先頭から順に）
void printL(){
    Node *p = head;
    while(p != NULL){
        printf("%d ", p->val);
        p = p->next;
    }
    printf("\n");
}

//n番目のノードを返す（1番目がhead）
Node* getN(int n){
    Node *p = head;
    for(int i = 1; i < n; i++){
        p = p->next;
    }
    return p;
}

//要素数を数える（countL）
int countL(){
    int ret = 0;
    Node *p = head;
    while(p != NULL){
        ret++;
        p = p->next;
    }
    return ret;
}

//値xを探す（searchX）→ 見つかったノード or NULL
Node* searchX(int x){
    for(Node *p = head; p != NULL; p = p->next){
        if(p->val == x) return p;
    }
    return NULL;
}

//先頭に挿入（insHead）
void insHead(int x){
    Node *p = createN(x);
    p->next = head; //今の先頭を後ろにつなぐ
    head = p; //新しい先頭
}

//先頭を削除（delHead）
void delHead(){
    Node *p = head;
    head = head->next; //次を先頭にする
    free(p);
}

//末尾に挿入（insTail）
void insTail(int x){
    Node *p = head;
    while(p->next != NULL){
        p = p->next;
    }
    p->next = createN(x);
}

//末尾を削除（delTail）
void delTail(){
    Node *p = head;
    while(p->next->next != NULL){
        p = p->next;
    }
    free(p->next);
    p->next = NULL;
}

//中間に挿入（n番目の後に挿入）
void insMiddle(int n, int x){
    Node *p = head;
    for(int i = 1; i < n; i++){
        p = p->next;
    }
    Node *q = createN(x);
    q->next = p->next;
    p->next = q;
}

//中間を削除（n番目を削除）
void delMiddle(int n){
    Node *p = head;
    for(int i = 1; i < n-1; i++){
        p = p->next;
    }
    Node *q = p->next;
    p->next = q->next;
    free(q);
}

int main(void){
    int n;
    scanf("%d", &n);

    initL(n); //n個で初期化
    printL(); //確認用

    //ここに好きな操作を追加して試す
    //insHead(100);
    //insTail(200);
    //insMiddle(2, 999);
    //delHead();
    //delTail();
    //delMiddle(3);

    printL();

    freeL();
    return 0;
}
