Related Articles
C Program for Reverse a linked list
• Last Updated : 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

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``#include`` ` `/* 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``();``}`

Recursive Method:
 `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``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 NULL``void` `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 node``Node *newNode(``int` `key)``{``    ``Node *temp = ``new` `Node;``    ``temp->data = key;``    ``temp->next = NULL;``    ``return` `temp;``}`` ` `// A utility function to print a linked list``void` `printlist(Node *head)``{``    ``while``(head != NULL)``    ``{``        ``cout << head->data << ``" "``;``        ``head = head->next;``    ``}``    ``cout << endl;``}`` ` `// Driver program to test above functions``int` `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;``}`

Please refer complete article on Reverse a linked list for more details!

Want to learn from the best curated videos and practice problems, check out the C Foundation Course for Basic to Advanced C.

My Personal Notes arrow_drop_up