# Reverse a Linked List Using Stack

“** Reverse a Linked List Using Stack**” is very popular programming problem based on linked list and stack data structures. Here, we are given a linked list and our task is to reverse a linked list using stack.

**Example:**

Suppose, we need to reverse the following linked list: LINKED LIST:12 -> 13 -> 14 -> 15 -> 16After reversing the list: LINKED LIST:16 -> 15 -> 14 -> 13 -> 12

The steps required to reverse a linked list using stack are as follows:

- If the linked list is empty, then simply return.
- Initialize a stack which can contains nodes.
- Push all the nodes in a stack except last nodes of a linked list.
- Make head to the last node of a linked list.
- Now, pop every node in stack and insert them at the end of the newly headed linked list.
- Print the reversed Linked List.

**C++Program to reverse a linked list using stack is as follows:**

```
/* C++ Program to Reverse a Linked List Using Stack */
#include<bits/stdc++.h>
using namespace std;
/* Strcutre of node of the Linked List */
typedef struct node
{
int data;
struct node *next;
}Node;
/* Function to Insert a Node at the end of the Linked List */
void insertEnd(Node **head,int ele)
{
/* Creating a New Node */
Node *new_node = new Node();
new_node -> data = ele;
new_node -> next = NULL;
/* Check whether Linked List is empty or not */
/* If Linked List is Empty, new node will become head of the Linked List */
if(*head == NULL)
{
(*head) = new_node;
return;
}
/* If Linked List is not empty, traverse the complete linked list and
points the pointer of the last node of the linked list to the new node */
Node *temp = (*head);
while(temp->next != NULL)
temp = temp -> next;
temp -> next = new_node;
}
/* Function to Print the Linked List */
void print(Node *head)
{
Node *temp = head;
while(temp != NULL)
{
cout << temp -> data << " ";
temp = temp -> next;
}
cout<<endl;
}
/* Function to Reverse a Linked List */
void reverse(Node **head)
{
/* Create a stack(using STL) of Node structure type */
stack<Node*>st;
Node *temp = (*head);
/* Insert all the nodes of the Linked List except last node */
while(temp->next != NULL)
{
st.push(temp);
temp = temp -> next;
}
/* Make Last Node the new head of the linked list */
*head = temp;
/* One-by-one pop all the nodes from the linked list
and insert at the end of the linked list */
while(!st.empty())
{
temp -> next = st.top();
temp = temp -> next;
st.pop();
}
temp -> next = NULL;
}
int main()
{
Node *head = NULL;
/* Inserting some nodes to the Linked List */
insertEnd(&head,1);
insertEnd(&head,2);
insertEnd(&head,3);
insertEnd(&head,4);
cout<<"Linked List Before Reversing:\n";
print(head);
/* Reverse a Linked List */
reverse(&head);
cout<<"\nLinked List After Reversing:\n";
print(head);
}
```

Linked List Before Reversing: 1 2 3 4 Linked List After Reversing: 4 3 2 1OUTPUT:

**Related Posts:**

**Reverse a Linked List.****Printing Linked List in Reverse Order without actually reversing the Linked List.****Swap Adjacent Elements of the Linked List.****Count All Occurrences of a Particular Node in a Linked List.****Bubble Sort on Linked List.****Detect a Loop in a Linked List.****Find the Length of the Loop present in the Linked List.****Detect and Remove Loop from a Linked List.****Segregate Even and Odd Nodes of the Linked List.****Delete Complete Linked List.****Delete Nth Node of the Linked List.****Delete without head pointer of the Linked List.****Delete All Occurrences of particular node of the Linked List.****Delete Alternate Nodes of the Linked List.****Delete every ‘N’ Nodes After ‘M’ Nodes of the Linked List.****Remove Duplicate Nodes from an Unsorted Linked List.****Remove Duplicate Nodes from a Sorted Linked List.****Find Union and Intersection of Two Linked List.****Merge Two Sorted Linked List.****Insert a New Node at the Middle of the Linked List.**