Table of Contents
We are given a linked list and two key values, we need to swap these nodes.
Example
Time complexity : O(n)
Algorithm
We need to handle these cases,
a. x and/or y may not present in the linked list.
b. x or y may be last node.
c. x or y may be head node.
d. x and y may or may not be adjacent.
In the swap function,
1. If x and y are same, do nothing just return the same linked list.
2. Search for x and y, if either of x or y is not present, do nothing just return the same linked list.
3. If x is not head, make x_prev->next as y, else make y as new head.
4. If y is not head, make y_prev->next as x, else make x as new head.
5. Swap next pointers. (x->next, y->next)
C++ Program
#include <bits/stdc++.h>
using namespace std;
struct LLNode
{
int data;
struct LLNode* next;
};
/* Function to insertAtBeginning a node */
void insertAtBeginning(struct LLNode** head, int dataToBeInserted)
{
struct LLNode* curr = new LLNode;
curr->data = dataToBeInserted;
curr->next = NULL;
if(*head == NULL)
*head=curr; //If this is first node make this as head of list
else
{
curr->next=*head; //else make the curr (new) node's next point to head and make this new node a the head
*head=curr;
}
//O(1) constant time
}
//display linked list
void display(struct LLNode**node)
{
struct LLNode *temp= *node;
while(temp!=NULL)
{
if(temp->next!=NULL)
cout<<temp->data<<"->";
else
cout<<temp->data;
temp=temp->next; //move to next node
}
//O(number of nodes)
cout<<endl;
}
/* Function to swap nodes x and y in linked list by
changing links */
void swapNodes(struct LLNode **head_ref, int x, int y)
{
//If x and y are same
if (x == y)
{
return;
}
//search for x and store previous of x
struct LLNode *x_prev = NULL, *x_curr = *head_ref;
while (x_curr && x_curr->data != x)
{
x_prev = x_curr;
x_curr = x_curr->next;
}
//search for y and store previous of y
struct LLNode *y_prev = NULL, *y_curr = *head_ref;
while (y_curr && y_curr->data != y)
{
y_prev = y_curr;
y_curr = y_curr->next;
}
//x or y not present
if (x_curr == NULL || y_curr == NULL)
{
return;
}
//If x is not head
if (x_prev != NULL)
{
x_prev->next = y_curr;
}
//If x is head
//make y as new head
else
{
*head_ref = y_curr;
}
//If y is not head
if (y_prev != NULL)
y_prev->next = x_curr;
//If y is head
//make x as new head
else
{
*head_ref = x_curr;
}
// Swap next pointers
struct LLNode *temp = y_curr->next;
y_curr->next = x_curr->next;
x_curr->next = temp;
}
//Main function
int main()
{
struct LLNode* head = NULL;//Initial list has no elements
insertAtBeginning(&head, 9);
insertAtBeginning(&head, 8);
insertAtBeginning(&head, 7);
insertAtBeginning(&head, 6);
insertAtBeginning(&head, 5);
insertAtBeginning(&head, 4);
insertAtBeginning(&head, 3);
insertAtBeginning(&head, 2);
insertAtBeginning(&head, 1);
cout<<"Input linked list is: ";
display(&head);
int x = 2, y = 7;
swapNodes(&head,x,y);
cout<<"output LL after swapping "<<x<<" and "<<y<<" is: ";
display(&head);
return 0;
}