Reverse a Singly Linked List in C++

This program demonstrates how to reverse a singly linked list in C++. The structure of the program is broken down into the following parts:

  • Definition of a singly linked list node.
  • Function to reverse the linked list.
  • Helper functions to create and display the linked list.
  • The main function to test the reversal.

Program Structure

1. Node Definition

Each node in a singly linked list contains a value and a pointer to the next node. The structure is defined as follows:

struct Node {
    int data;
    Node* next;
    Node(int val) : data(val), next(nullptr) {}
};

2. Reverse Function

This function reverses the linked list by iterating through the list and adjusting the pointers. It uses three pointers: prev, current, and next. The algorithm is as follows:

  • Initialize prev to nullptr and current to the head of the list.
  • Iterate through the list, setting next to current->next.
  • Set current->next to prev to reverse the link.
  • Move prev and current one step forward.
  • Continue until the list is fully reversed.
  • Finally, set the head of the list to prev.
Node* reverseList(Node* head) {
    Node* prev = nullptr;
    Node* current = head;
    Node* next = nullptr;

    while (current != nullptr) {
        next = current->next;   // Store next node
        current->next = prev;    // Reverse the current node's pointer
        prev = current;           // Move pointers one position ahead
        current = next;
    }

    return prev; // New head of the reversed list
}

3. Helper Functions

These functions assist in creating and displaying the linked list. push() inserts a new node at the beginning of the list, and printList() prints all the elements of the list.

void push(Node** head_ref, int new_data) {
    Node* new_node = new Node(new_data);
    new_node->next = (*head_ref);
    (*head_ref) = new_node;
}

void printList(Node* node) {
    while (node != nullptr) {
        std::cout << node->data << " ";
        node = node->next;
    }
    std::cout << std::endl;
}

4. Main Function

The main function tests the linked list reversal by creating a list, printing it, reversing it, and then printing the reversed list.

int main() {
    Node* head = nullptr;

    // Create linked list 1->2->3->4->5
    push(&head, 5);
    push(&head, 4);
    push(&head, 3);
    push(&head, 2);
    push(&head, 1);

    std::cout << "Original List: ";
    printList(head);

    head = reverseList(head);

    std::cout << "Reversed List: ";
    printList(head);

    return 0;
}

Explanation

The program begins by defining a Node structure to represent each element in the singly linked list. The reverseList() function takes the head of the linked list and reverses the order of the nodes by manipulating the pointers. The helper functions push() and printList() make it easy to build and display the linked list.

In the main() function, we create a sample linked list, display it, reverse it using the reverseList() function, and then display the reversed list.

Output

Running this program will produce the following output:

Original List: 1 2 3 4 5 
Reversed List: 5 4 3 2 1

This demonstrates that the list has been successfully reversed.

 

By Aditya Bhuyan

I work as a cloud specialist. In addition to being an architect and SRE specialist, I work as a cloud engineer and developer. I have assisted my clients in converting their antiquated programmes into contemporary microservices that operate on various cloud computing platforms such as AWS, GCP, Azure, or VMware Tanzu, as well as orchestration systems such as Docker Swarm or Kubernetes. For over twenty years, I have been employed in the IT sector as a Java developer, J2EE architect, scrum master, and instructor. I write about Cloud Native and Cloud often. Bangalore, India is where my family and I call home. I maintain my physical and mental fitness by doing a lot of yoga and meditation.

Leave a Reply

Your email address will not be published. Required fields are marked *

error

Enjoy this blog? Please spread the word :)