C Program for Reverse a linked list - GeeksforGeeks

20 Dec, 2018
Given pointer to the head node of a linked list, the task is to reverse the linked list. We need to reverse the list by changing links between nodes.
Examples:
Input : Head of following linked list  
       1->2->3->4->NULL
Output : Linked list should be changed to,
       4->3->2->1->NULL

Input : Head of following linked list  
       1->2->3->4->5->NULL
Output : Linked list should be changed to,
       5->4->3->2->1->NULL

Input : NULL
Output : NULL

Input  : 1->NULL
Output : 1->NULL

Iterative Method
C
#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* prev   = NULL;    struct Node* current = *head_ref;    struct Node* next;    while (current != NULL)    {        next  = current->next;          current->next = prev;           prev = current;        current = next;    }    *head_ref = prev;}  /* Function to push a node */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 linked list */void printList(struct Node *head){    struct Node *temp = head;    while(temp != NULL)    {        printf("%d  ", temp->data);            temp = temp->next;      }}      /* Driver program to test above function*/int main(){    /* Start with the empty list */    struct Node* head = NULL;         push(&head, 20);     push(&head, 4);     push(&head, 15);      push(&head, 85);                 printf("Given linked list\n");     printList(head);         reverse(&head);                           printf("\nReversed Linked list \n");     printList(head);         getchar();}
void recursiveReverse(struct Node** head_ref){    struct Node* first;    struct Node* rest;           /* empty list */    if (*head_ref == NULL)       return;         /* suppose first = {1, 2, 3}, rest = {2, 3} */    first = *head_ref;      rest  = first->next;      /* List has only one node */    if (rest == NULL)       return;         /* reverse the rest list and put the first element at the end */    recursiveReverse(&rest);    first->next->next  = first;            /* tricky step -- see the diagram */    first->next  = NULL;                /* fix the head pointer */    *head_ref = rest;              }
A Simpler and Tail Recursive Method
C++
// A simple and tail recursive C++ program to reverse// a linked list#include<bits/stdc++.h>using namespace std;  struct Node{    int data;    struct Node *next;};  void reverseUtil(Node *curr, Node *prev, Node **head);  // This function mainly calls reverseUtil()// with prev as NULLvoid reverse(Node **head){    if (!head)        return;    reverseUtil(*head, NULL, head);}  // A simple and tail recursive function to reverse// a linked list.  prev is passed as NULL initially.void reverseUtil(Node *curr, Node *prev, Node **head){    /* If last node mark it head*/    if (!curr->next)    {        *head = curr;          /* Update next to prev node */        curr->next = prev;        return;    }      /* Save curr->next node for recursive call */    node *next = curr->next;      /* and update next ..*/    curr->next = prev;      reverseUtil(next, curr, head);}  // A utility function to create a new nodeNode *newNode(int key){    Node *temp = new Node;    temp->data = key;    temp->next = NULL;    return temp;}  // A utility function to print a linked listvoid printlist(Node *head){    while(head != NULL)    {        cout << head->data << " ";        head = head->next;    }    cout << endl;}  // Driver program to test above functionsint main(){    Node *head1 = newNode(1);    head1->next = newNode(2);    head1->next->next = newNode(3);    head1->next->next->next = newNode(4);    head1->next->next->next->next = newNode(5);    head1->next->next->next->next->next = newNode(6);    head1->next->next->next->next->next->next = newNode(7);    head1->next->next->next->next->next->next->next = newNode(8);    cout << "Given linked list\n";    printlist(head1);    reverse(&head1);    cout << "\nReversed linked list\n";    printlist(head1);    return 0;}
C Programs
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
C Program to read contents of Whole File
Producer Consumer Problem in C
Exit codes in C/C++ with Examples
C program to find the length of a string
C / C++ Program for Dijkstra's shortest path algorithm | Greedy Algo-7
Handling multiple clients on server with multithreading using Socket Programming in C/C++
Regular expressions in C
Conditional wait and signal in multi-threading
Create n-child process from same parent process using fork() in C
How to store words in an array in C?