/* C program to pairwise swap elements in a given linked list */
#include<stdio.h>
#include<stdlib.h>
#define null NULL
/* A linked list node */
struct node
{
int data;
struct node *next;
};
struct node* swapPairs(struct node* head) {
struct node *prev = head;
struct node *curr;
struct node *next = null, *tail = null;
while(prev != null && prev->next != null) {
curr = prev->next;
next = curr->next;
curr->next = prev;
if(tail != null) tail->next = curr;
else head = curr; //First two nodes are swapped. First node (previously second node) will be new head
tail = prev; //Tail of lastly swapped nodes i.e. previously first one of them
prev = next; //Swapping done between curr and pre, now move to next node
}
if(tail != null) {
tail->next = prev;
}
return head;
}
/* Function to add a node at the begining of Linked List */
void push(struct node** head_ref, int new_data)
{
/* allocate node */
struct node* new_node =
(struct node*) malloc(sizeof(struct node));
/* put in the data */
new_node->data = new_data;
/* link the old list off the new node */
new_node->next = (*head_ref);
/* move the head to point to the new node */
(*head_ref) = new_node;
}
/* Function to print nodes in a given linked list */
void printList(struct node *node)
{
while (node != NULL)
{
printf("%d ", node->data);
node = node->next;
}
}
int main()
{
struct node *start = NULL;
/* The constructed linked list is:
2->3->4->5 */
push(&start, 5);
push(&start, 4);
push(&start, 3);
push(&start, 2);
//push(&start, 1);
printf("Linked list before calling swapPairs()\n");
printList(start);
start = swapPairs(start);
printf("\nLinked list after calling swapPairs()\n");
printList(start);
return 0;
}
LyogQyBwcm9ncmFtIHRvIHBhaXJ3aXNlIHN3YXAgZWxlbWVudHMgaW4gYSBnaXZlbiBsaW5rZWQgbGlzdCAqLwojaW5jbHVkZTxzdGRpby5oPgojaW5jbHVkZTxzdGRsaWIuaD4KI2RlZmluZSBudWxsIE5VTEwKLyogQSBsaW5rZWQgbGlzdCBub2RlICovCnN0cnVjdCBub2RlCnsKCWludCBkYXRhOwoJc3RydWN0IG5vZGUgKm5leHQ7Cn07CgpzdHJ1Y3Qgbm9kZSogc3dhcFBhaXJzKHN0cnVjdCBub2RlKiBoZWFkKSB7CiAgICBzdHJ1Y3Qgbm9kZSAqcHJldiA9IGhlYWQ7ICAgIAogICAgc3RydWN0IG5vZGUgKmN1cnI7CiAgICBzdHJ1Y3Qgbm9kZSAqbmV4dCA9IG51bGwsICp0YWlsID0gbnVsbDsgICAgICAKICAgIHdoaWxlKHByZXYgIT0gbnVsbCAmJiBwcmV2LT5uZXh0ICE9IG51bGwpIHsKICAgICAgICBjdXJyID0gcHJldi0+bmV4dDsKICAgICAgICBuZXh0ID0gY3Vyci0+bmV4dDsgICAgICAKICAgICAgICBjdXJyLT5uZXh0ID0gcHJldjsKICAgICAgICBpZih0YWlsICE9IG51bGwpIHRhaWwtPm5leHQgPSBjdXJyOwogICAgICAgIGVsc2UgaGVhZCA9IGN1cnI7IC8vRmlyc3QgdHdvIG5vZGVzIGFyZSBzd2FwcGVkLiBGaXJzdCBub2RlIChwcmV2aW91c2x5IHNlY29uZCBub2RlKSB3aWxsIGJlIG5ldyBoZWFkCiAgICAgICAgdGFpbCA9IHByZXY7ICAgICAgLy9UYWlsIG9mIGxhc3RseSBzd2FwcGVkIG5vZGVzIGkuZS4gcHJldmlvdXNseSBmaXJzdCBvbmUgb2YgdGhlbSAKICAgICAgICBwcmV2ID0gbmV4dDsgICAgICAvL1N3YXBwaW5nIGRvbmUgYmV0d2VlbiBjdXJyIGFuZCBwcmUsIG5vdyBtb3ZlIHRvIG5leHQgbm9kZSAKICAgIH0KICAgIGlmKHRhaWwgIT0gbnVsbCkgewogICAgICAgdGFpbC0+bmV4dCA9IHByZXY7IAogICAgfQogICAgcmV0dXJuIGhlYWQ7ICAKfQoKLyogRnVuY3Rpb24gdG8gYWRkIGEgbm9kZSBhdCB0aGUgYmVnaW5pbmcgb2YgTGlua2VkIExpc3QgKi8Kdm9pZCBwdXNoKHN0cnVjdCBub2RlKiogaGVhZF9yZWYsIGludCBuZXdfZGF0YSkKewoJLyogYWxsb2NhdGUgbm9kZSAqLwoJc3RydWN0IG5vZGUqIG5ld19ub2RlID0KCQkJKHN0cnVjdCBub2RlKikgbWFsbG9jKHNpemVvZihzdHJ1Y3Qgbm9kZSkpOwoKCS8qIHB1dCBpbiB0aGUgZGF0YSAqLwoJbmV3X25vZGUtPmRhdGEgPSBuZXdfZGF0YTsKCgkvKiBsaW5rIHRoZSBvbGQgbGlzdCBvZmYgdGhlIG5ldyBub2RlICovCgluZXdfbm9kZS0+bmV4dCA9ICgqaGVhZF9yZWYpOwoKCS8qIG1vdmUgdGhlIGhlYWQgdG8gcG9pbnQgdG8gdGhlIG5ldyBub2RlICovCgkoKmhlYWRfcmVmKSA9IG5ld19ub2RlOwp9CgovKiBGdW5jdGlvbiB0byBwcmludCBub2RlcyBpbiBhIGdpdmVuIGxpbmtlZCBsaXN0ICovCnZvaWQgcHJpbnRMaXN0KHN0cnVjdCBub2RlICpub2RlKQp7Cgl3aGlsZSAobm9kZSAhPSBOVUxMKQoJewoJCXByaW50ZigiJWQgIiwgbm9kZS0+ZGF0YSk7Cglub2RlID0gbm9kZS0+bmV4dDsKCX0KfQoKaW50IG1haW4oKQp7CglzdHJ1Y3Qgbm9kZSAqc3RhcnQgPSBOVUxMOwoKCS8qIFRoZSBjb25zdHJ1Y3RlZCBsaW5rZWQgbGlzdCBpczoKCTItPjMtPjQtPjUgKi8KCXB1c2goJnN0YXJ0LCA1KTsKCXB1c2goJnN0YXJ0LCA0KTsKCXB1c2goJnN0YXJ0LCAzKTsKCXB1c2goJnN0YXJ0LCAyKTsKCS8vcHVzaCgmc3RhcnQsIDEpOwoKCXByaW50ZigiTGlua2VkIGxpc3QgYmVmb3JlIGNhbGxpbmcgc3dhcFBhaXJzKClcbiIpOwoJcHJpbnRMaXN0KHN0YXJ0KTsKICAgIHN0YXJ0ID0gc3dhcFBhaXJzKHN0YXJ0KTsKCglwcmludGYoIlxuTGlua2VkIGxpc3QgYWZ0ZXIgY2FsbGluZyBzd2FwUGFpcnMoKVxuIik7CglwcmludExpc3Qoc3RhcnQpOwoKCXJldHVybiAwOwp9Cg==