#include <stdio.h>
#include <stdlib.h>
struct node {
    int num;
    struct node* next;
};
int main() {
    int n, i;
    scanf("%d", &n);
    int a[n];
    struct node* head = (struct node*)malloc(sizeof(struct node));
    struct node* p = head;
    for (i = 0; i < n; i++) {//该循环将数组转化为链表
        scanf("%d", &a[i]);
        head->next = (struct node*)malloc(sizeof(struct node));
        head->next->num = a[i];
        head = head->next;
        if (i == n - 1) head->next = NULL;
    }
    head = p;
    if (n == 1 || n == 2) {//如果链表只有一个或两个节点,那么无论交不交换都是一样的,直接输出
        while (p->next) {
            printf("%d ", p->next->num);
            p = p->next;
        }
    } else {//当链表至少有三个节点时,考虑先将前两个节点进行交换,再对最后两个节点进行交换
        struct node* q, *k;//要想交换前两个节点,首先要保存头结点的地址,否则当头指针指向第二个节点的时候,第一个节点的地址就无法得到了,同时也要保存第三个节点的地址,因为当第二个节点的指针指向第一个节点的时候,第三个节点的地址也无法得到了。
        k = head->next; //保存头结点的地址
        q = head->next->next->next; //保存第三个节点的地址
        p->next = p->next->next;
        p->next->next = k;
        p->next->next->next = q;
        while (1) {//对最后两个节点进行交换
            if (p->next->next->next == NULL) {//此条件即为临时指指针向了倒数第三个节点,此时可以对最后两个节点进行交换
                k = p->next; //保存倒数第二个节点的地址,原理同上
                p->next = p->next->next;
                p->next->next = k;
                p->next->next->next = NULL;
                break;
            }
            p = p->next;
        }
        p = head;//让临时指针重新指向一开始的位置,遍历输出交换后的链表即可
        while (p->next) {
            printf("%d ", p->next->num);
            p = p->next;
        }
    }
    return 0;
}