Skip to content
Related Articles

Related Articles

Save Article
Improve Article
Save Article
Like Article

Reverse a circular linked list

  • Difficulty Level : Easy
  • Last Updated : 22 Jun, 2021

Given a circular linked list of size n. The problem is to reverse the given circular linked list by changing links between the nodes.
Examples: 
INPUT: 
 

INPUT:

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

OUTPUT: 
 



OUTPUT:

 

Approach: The approach is same as followed in reversing a singly linked list. Only here we have to make one more adjustment by linking the last node of the reversed list to the first node.
 

C++




// C++ implementation to reverse
// a circular linked list
#include <bits/stdc++.h>
 
using namespace std;
 
// Linked list node
struct Node {
    int data;
    Node* next;
};
 
// function to get a new node
Node* getNode(int data)
{
    // allocate memory for node
    Node* newNode = new Node;
 
    // put in the data
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}
 
// Function to reverse the circular linked list
void reverse(Node** head_ref)
{
    // if list is empty
    if (*head_ref == NULL)
        return;
 
    // reverse procedure same as reversing a
    // singly linked list
    Node* prev = NULL;
    Node* current = *head_ref;
    Node* next;
    do {
        next = current->next;
        current->next = prev;
        prev = current;
        current = next;
    } while (current != (*head_ref));
 
    // adjutsing the links so as to make the
    // last node point to the first node
    (*head_ref)->next = prev;
    *head_ref = prev;
}
 
// Function to print circular linked list
void printList(Node* head)
{
    if (head == NULL)
        return;
 
    Node* temp = head;
    do {
        cout << temp->data << " ";
        temp = temp->next;
    } while (temp != head);
}
 
// Driver program to test above
int main()
{
    // Create a circular linked list
    // 1->2->3->4->1
    Node* head = getNode(1);
    head->next = getNode(2);
    head->next->next = getNode(3);
    head->next->next->next = getNode(4);
    head->next->next->next->next = head;
 
    cout << "Given circular linked list: ";
    printList(head);
 
    reverse(&head);
 
    cout << "\nReversed circular linked list: ";
    printList(head);
 
    return 0;
}

Java




// Java implementation to reverse
// a circular linked list
class GFG
{
 
// Linked list node
static class Node
{
    int data;
    Node next;
};
 
// function to get a new node
static Node getNode(int data)
{
    // allocate memory for node
    Node newNode = new Node();
 
    // put in the data
    newNode.data = data;
    newNode.next = null;
    return newNode;
}
 
// Function to reverse the circular linked list
static Node reverse(Node head_ref)
{
    // if list is empty
    if (head_ref == null)
        return null;
 
    // reverse procedure same as reversing a
    // singly linked list
    Node prev = null;
    Node current = head_ref;
    Node next;
    do
    {
        next = current.next;
        current.next = prev;
        prev = current;
        current = next;
    } while (current != (head_ref));
 
    // adjutsing the links so as to make the
    // last node point to the first node
    (head_ref).next = prev;
    head_ref = prev;
    return head_ref;
}
 
// Function to print circular linked list
static void printList(Node head)
{
    if (head == null)
        return;
 
    Node temp = head;
    do
    {
        System.out.print( temp.data + " ");
        temp = temp.next;
    } while (temp != head);
}
 
// Driver code
public static void main(String args[])
{
    // Create a circular linked list
    // 1.2.3.4.1
    Node head = getNode(1);
    head.next = getNode(2);
    head.next.next = getNode(3);
    head.next.next.next = getNode(4);
    head.next.next.next.next = head;
 
    System.out.print("Given circular linked list: ");
    printList(head);
 
    head = reverse(head);
 
    System.out.print("\nReversed circular linked list: ");
    printList(head);
 
}
}
 
// This code is contributed by Arnab Kundu

Python3




# Python3 implementation to reverse
# a circular linked list
import math
 
# Linked list node
class Node:
    def __init__(self, data):
        self.data = data
        self.next = None
 
# function to get a new node
def getNode(data):
     
    # allocate memory for node
    newNode = Node(data)
 
    # put in the data
    newNode.data = data
    newNode.next = None
    return newNode
 
# Function to reverse the
# circular linked list
def reverse(head_ref):
     
    # if list is empty
    if (head_ref == None):
        return None
 
    # reverse procedure same as
    # reversing a singly linked list
    prev = None
    current = head_ref
     
    next = current.next
    current.next = prev
    prev = current
    current = next
    while (current != head_ref):
        next = current.next
        current.next = prev
        prev = current
        current = next
 
    # adjutsing the links so as to make the
    # last node po to the first node
    head_ref.next = prev
    head_ref = prev
    return head_ref
 
# Function to print circular linked list
def prList(head):
    if (head == None):
        return
 
    temp = head
     
    print(temp.data, end = " ")
    temp = temp.next
    while (temp != head):
        print(temp.data, end = " ")
        temp = temp.next
 
# Driver Code
if __name__=='__main__':
     
    # Create a circular linked list
    # 1.2.3.4.1
    head = getNode(1)
    head.next = getNode(2)
    head.next.next = getNode(3)
    head.next.next.next = getNode(4)
    head.next.next.next.next = head
 
    print("Given circular linked list: ",
                                end = "")
    prList(head)
 
    head = reverse(head)
 
    print("\nReversed circular linked list: ",
                                     end = "")
    prList(head)
 
# This code is contributed by Srathore

C#




// C# implementation to reverse
// a circular linked list
using System;
 
class GFG
{
 
    // Linked list node
    public class Node
    {
        public int data;
        public Node next;
    };
     
    // function to get a new node
    static Node getNode(int data)
    {
        // allocate memory for node
        Node newNode = new Node();
     
        // put in the data
        newNode.data = data;
        newNode.next = null;
        return newNode;
    }
     
    // Function to reverse the circular linked list
    static Node reverse(Node head_ref)
    {
        // if list is empty
        if (head_ref == null)
            return null;
     
        // reverse procedure same as reversing a
        // singly linked list
        Node prev = null;
        Node current = head_ref;
        Node next;
        do
        {
            next = current.next;
            current.next = prev;
            prev = current;
            current = next;
        } while (current != (head_ref));
     
        // adjutsing the links so as to make the
        // last node point to the first node
        (head_ref).next = prev;
        head_ref = prev;
        return head_ref;
    }
     
    // Function to print circular linked list
    static void printList(Node head)
    {
        if (head == null)
            return;
     
        Node temp = head;
        do
        {
            Console.Write( temp.data + " ");
            temp = temp.next;
        } while (temp != head);
    }
     
    // Driver code
    public static void Main(String []args)
    {
        // Create a circular linked list
        // 1.2.3.4.1
        Node head = getNode(1);
        head.next = getNode(2);
        head.next.next = getNode(3);
        head.next.next.next = getNode(4);
        head.next.next.next.next = head;
     
        Console.Write("Given circular linked list: ");
        printList(head);
     
        head = reverse(head);
     
        Console.Write("\nReversed circular linked list: ");
        printList(head);
     
    }
}
 
// This code contributed by Rajput-Ji

Javascript




<script>
 
      // JavaScript implementation to reverse
      // a circular linked list
      // Linked list node
      class Node {
        constructor() {
          this.data = 0;
          this.next = null;
        }
      }
 
      // function to get a new node
      function getNode(data) {
        // allocate memory for node
        var newNode = new Node();
 
        // put in the data
        newNode.data = data;
        newNode.next = null;
        return newNode;
      }
 
      // Function to reverse the circular linked list
      function reverse(head_ref) {
        // if list is empty
        if (head_ref == null) return null;
 
        // reverse procedure same as reversing a
        // singly linked list
        var prev = null;
        var current = head_ref;
        var next;
        do {
          next = current.next;
          current.next = prev;
          prev = current;
          current = next;
        } while (current != head_ref);
 
        // adjutsing the links so as to make the
        // last node point to the first node
        head_ref.next = prev;
        head_ref = prev;
        return head_ref;
      }
 
      // Function to print circular linked list
      function printList(head) {
        if (head == null) return;
 
        var temp = head;
        do {
          document.write(temp.data + " ");
          temp = temp.next;
        } while (temp != head);
      }
 
      // Driver code
      // Create a circular linked list
      // 1.2.3.4.1
      var head = getNode(1);
      head.next = getNode(2);
      head.next.next = getNode(3);
      head.next.next.next = getNode(4);
      head.next.next.next.next = head;
 
      document.write("Given circular linked list: ");
      printList(head);
 
      head = reverse(head);
 
      document.write("<br>Reversed circular linked list: ");
      printList(head);
       
</script>

Output:  

Given circular linked list: 1 2 3 4
Reversed circular linked list: 4 3 2 1

Time Complexity: O(n)
This article is contributed by Ayush Jauhari. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
 




My Personal Notes arrow_drop_up
Recommended Articles
Page :