# C program to reverse a Singly Linked List

Write a C program to create a singly linked list of n nodes and reverse the order of nodes of the given linked list. How to reverse a singly linked list in C. Algorithm and steps to reverse a singly linked list.

## Required knowledge

Basic C programming, Functions, Singly Linked List, Dynamic memory allocation

## Algorithm to reverse a Singly Linked List

Algorithm to reverse a Singly Linked List
Begin:
prevNode.nextNULL
curNode.nextprevNode
prevNodecurNode
End while
End if
End

## Steps to reverse a Singly Linked List

1. Create two more pointers other than head namely prevNode and curNode that will hold the reference of previous node and current node respectively.
Make sure that prevNode points to first node i.e. prevNode = head.
curNode should also points to the second node i.e. curNode = head.

2. Now, disconnect the previous node i.e. the first node from others. We will make sure that it points to none. As this node is going to be our last node. Perform operation prevNode->next = NULL.

4. Now, re-connect the current node to its previous node i.e. curNode->next = prevNode;.

5. Point the previous node to current node and current node to head node. Means they should now point to prevNode = curNode; and curNode = head.

6. Repeat steps 3-5 till head pointer becomes NULL.

7. Now, after all nodes has been re-connected in the reverse order. Make the last node as the first node. Means the head pointer should point to prevNode pointer. Perform head = prevNode;. Finally you end up with a reversed linked list of its original.

## Program to revere a Singly Linked List

/**
* C program to reverse a Singly Linked List
*/

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

/* Structure of a node */
struct node {
int data; //Data part

/* Functions used in the program */
void createList(int n);
void reverseList();
void displayList();

int main()
{
int n, choice;

/*
* Create a singly linked list of n nodes
*/
printf("Enter the total number of nodes: ");
scanf("%d", &n);
createList(n);

printf("\nData in the list \n");
displayList();

/*
* Reverse the list
*/
printf("\nPress 1 to reverse the order of singly linked list\n");
scanf("%d", &choice);
if(choice == 1)
{
reverseList();
}

printf("\nData in the list\n");
displayList();

return 0;
}

/*
* Create a list of n nodes
*/
void createList(int n)
{
struct node *newNode, *temp;
int data, i;

if(n <= 0)
{
printf("List size must be greater than zero.\n");
return;
}

head = (struct node *)malloc(sizeof(struct node));

/*
* If unable to allocate memory for head node
*/
{
printf("Unable to allocate memory.");
}
else
{
/*
* Read data of node from the user
*/
printf("Enter the data of node 1: ");
scanf("%d", &data);

/*
*/
for(i=2; i<=n; i++)
{
newNode = (struct node *)malloc(sizeof(struct node));

/* If memory is not allocated for newNode */
if(newNode == NULL)
{
printf("Unable to allocate memory.");
break;
}
else
{
printf("Enter the data of node %d: ", i);
scanf("%d", &data);

newNode->data = data; // Link the data field of newNode with data
newNode->next = NULL; // Link the address field of newNode with NULL

temp->next = newNode; // Link previous node i.e. temp to the newNode
temp = temp->next;
}
}

}
}

/*
* Reverse the order of nodes of a singly linked list
*/
void reverseList()
{
struct node *prevNode, *curNode;

{

prevNode->next = NULL; // Make first node as last node

{
curNode->next = prevNode;

prevNode = curNode;
}

printf("SUCCESSFULLY REVERSED LIST\n");
}
}

/*
* Display entire list
*/
void displayList()
{
struct node *temp;

/*
* If the list is empty i.e. head = NULL
*/
{
printf("List is empty.");
}
else
{
while(temp != NULL)
{
printf("Data = %d\n", temp->data); // Print the data of current node
temp = temp->next;                 // Move to next node
}
}
}

Output

Enter the total number of nodes: 5
Enter the data of node 1: 10
Enter the data of node 2: 20
Enter the data of node 3: 30
Enter the data of node 4: 40
Enter the data of node 5: 50

Data in the list
Data = 10
Data = 20
Data = 30
Data = 40
Data = 50

Press 1 to reverse the order of singly linked list
1
SUCCESSFULLY REVERSED LIST

Data in the list
Data = 50
Data = 40
Data = 30
Data = 20
Data = 10

Happy coding 😉