Given a singly linked list, write a function to swap elements pairwise. For example, if the linked list is 1->2->3->4->5 then the function should change it to 2->1->4->3->5, and if the linked list is 1->2->3->4->5->6 then the function should change it to 2->1->4->3->6->5.
METHOD 1 (Iterative)
Start from the head node and traverse the list. While traversing swap data of each node with its next node’s data
C++ Programming:
#include<stdio.h>
#include<stdlib.h>
struct node
{
int data;
struct node *next;
};
void swap(int *a, int *b);
void pairWiseSwap(struct node *head)
{
struct node *temp = head;
while (temp != NULL && temp->next != NULL)
{
swap(&temp->data, &temp->next->data);
temp = temp->next->next;
}
}
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void push(struct node** head_ref, int new_data)
{
struct node* new_node =
(struct node*) malloc(sizeof(struct node));
new_node->data = new_data;
new_node->next = (*head_ref);
(*head_ref) = new_node;
}
void printList(struct node *node)
{
while (node != NULL)
{
printf("%d ", node->data);
node = node->next;
}
}
int main()
{
struct node *start = NULL;
push(&start, 5);
push(&start, 4);
push(&start, 3);
push(&start, 2);
push(&start, 1);
printf("Linked list before calling pairWiseSwap()\n");
printList(start);
pairWiseSwap(start);
printf("\nLinked list after calling pairWiseSwap()\n");
printList(start);
return 0;
}
Output:
Linked List before calling pairWiseSwap()
1 2 3 4 5
Linked List after calling pairWiseSwap()
2 1 4 3 5
Time complexity: O(n)
METHOD 2 (Recursive)
If there are 2 or more than 2 nodes in Linked List then swap the first two nodes and recursively call for rest of the list.
C++ Programming:
void pairWiseSwap(struct node *head)
{
if (head != NULL && head->next != NULL)
{
swap(&head->data, &head->next->data);
pairWiseSwap(head->next->next);
}
}
Time complexity: O(n)