C Program for Reversing a Linked List without changing the links between the nodes(Data Reverse Only)

Reverse a linked list without changing links between nodes (Data reverse only)

Here, in this page we will discuss Reverse a linked list without changing links between nodes in C. We create a vector and store the elements of the linked list and them change the linked list node data by iterating the vector in reverse manner.
reverse a linked list without changing links

Algorithm :

  • Create a node say current and set it to head.
  • Now, Create a variable to store size of linked list. We will iterate over all nodes of linked list and increment the size variable by 1 and set current to next node. Repeat this till the current node does not become  NULL.
  • Create an array of size (size) to store the node value in it.And create a variable say x points to last index of the array. We will iterate over all nodes of linked list and insert the current node data in that array position and decrement the x by 1 and set current to next node. Repeat this till the current node does not become NULL.
  • Now, again set current to head and take a variable say x and set it to 0.
  • Now, change the current node data with array[x] and increment the x by 1 and set current to next node. Repeat this till current node does not become NULL.
  • In this way we can Reverse a linked list without changing links between nodes in C.
C Program for Reversing a Linked List without changing the links between the nodes

Code in C based on above Algorithm

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

/* Link list node */
struct Node
{
  int data;
  struct Node *next;
};

/* Function to reverse the linked list */
static void reverse (struct Node **head_ref)
{
  struct Node *current = *head_ref;
  int size = 0;

  while (current != NULL)
    {
      size++;
      current = current->next;
    }

  int a[size];

  int x = size - 1;

  current = *head_ref;
  while (current != NULL)
    {
      a[x--] = current->data;
      current = current->next;
    }
  current = *head_ref;
  x = 0;

  while (current != NULL)
    {
      current->data = a[x++];
      current = current->next;
    }
}

/* Function to push a node by user
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;
}
*/

/* Function to print linked list */
void Display (struct Node *head)
{
  struct Node *temp = head;
  while (temp != NULL)
    {
      printf ("%d  ", temp->data);
      temp = temp->next;
    }
}

/* Driver code*/
int main ()
{
  //creating 4 pointers of type struct Node
  //So these can point to address of struct type variable
  struct Node *head = NULL;
  struct Node *node2 = NULL;
  struct Node *node3 = NULL;
  struct Node *node4 = NULL;

  // allocate 3 nodes in the heap 
  head = (struct Node *) malloc (sizeof (struct Node));
  node2 = (struct Node *) malloc (sizeof (struct Node));
  node3 = (struct Node *) malloc (sizeof (struct Node));
  node4 = (struct Node *) malloc (sizeof (struct Node));


  head->data = 5;		// data set for head node 
  head->next = node2;		// next pointer assigned to address of node2 

  node2->data = 10;
  node2->next = node3;

  node3->data = 15;
  node3->next = node4;

  node4->data = 20;
  node4->next = NULL;

  printf ("Given Linked list: ");
  Display (head);

  reverse (&head);

  printf ("\n\nReversed Linked list: ");
  Display (head);

  return 0;
}

Output:

Given Linked list: 5 10 15 20

Reversed Linked list: 20 15 10 5