Invertir una lista enlazada doblemente circular

El problema es invertir la lista enlazada doblemente circular dada.

Ejemplos: 
Entrada: 

Doubly circular linked list

Producción:  

Reverse doubly circular linked list

Algoritmo:  

insertEnd(head, new_node) 
    Declare last

    if head == NULL then
        new_node->next = new_node->prev = new_node
        head = new_node
        return 
     
    last = head->prev
    new_node->next = head  
    head->prev = new_node
    new_node->prev = last  
    last->next = new_node

reverse(head)
    Initialize new_head = NULL
    Declare last
    
    last = head->prev
    Initialize curr = last, prev
    
    while curr->prev != last
        prev = curr->prev
        insertEnd(&new_head, curr)
        curr = prev
    insertEnd(&new_head, curr)
    
    return new_head

Explicación: El encabezado de la variable en la lista de parámetros de insertEnd() es un puntero a una variable de puntero. reverse() atraviesa la lista enlazada doblemente circular comenzando con el puntero de la cabeza en la dirección hacia atrás y uno por uno obtiene el Node en el recorrido. Inserta esos Nodes al final de la lista que comienza con el puntero new_head con la ayuda de la función insertEnd() y finalmente devuelve el new_head

C++

// C++ implementation to reverse a
// doubly circular linked list
#include <bits/stdc++.h>
 
using namespace std;
 
// structure of a node of linked list
struct Node {
    int data;
    Node *next, *prev;
};
 
// function to create and return a new node
Node* getNode(int data)
{
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    return newNode;
}
 
// Function to insert at the end
void insertEnd(Node** head, Node* new_node)
{
    // If the list is empty, create a single node
    // circular and doubly list
    if (*head == NULL) {
        new_node->next = new_node->prev = new_node;
        *head = new_node;
        return;
    }
 
    // If list is not empty
 
    /* Find last node */
    Node* last = (*head)->prev;
 
    // Start is going to be next of new_node
    new_node->next = *head;
 
    // Make new node previous of start
    (*head)->prev = new_node;
 
    // Make last previous of new node
    new_node->prev = last;
 
    // Make new node next of old last
    last->next = new_node;
}
 
// Utility function to reverse a
// doubly circular linked list
Node* reverse(Node* head)
{
    if (!head)
        return NULL;
 
    // Initialize a new head pointer
    Node* new_head = NULL;
 
    // get pointer to the last node
    Node* last = head->prev;
 
    // set 'curr' to last node
    Node *curr = last, *prev;
 
    // traverse list in backward direction
    while (curr->prev != last) {
        prev = curr->prev;
 
        // insert 'curr' at the end of the list
        // starting with the 'new_head' pointer
        insertEnd(&new_head, curr);
        curr = prev;
    }
    insertEnd(&new_head, curr);
 
    // head pointer of the reversed list
    return new_head;
}
 
// function to display a doubly circular list in
// forward and backward direction
void display(Node* head)
{
    if (!head)
        return;
 
    Node* temp = head;
 
    cout << "Forward direction: ";
    while (temp->next != head) {
        cout << temp->data << " ";
        temp = temp->next;
    }
    cout << temp->data;
 
    Node* last = head->prev;
    temp = last;
 
    cout << "\nBackward direction: ";
    while (temp->prev != last) {
        cout << temp->data << " ";
        temp = temp->prev;
    }
    cout << temp->data;
}
 
// Driver program to test above
int main()
{
    Node* head = NULL;
 
    insertEnd(&head, getNode(1));
    insertEnd(&head, getNode(2));
    insertEnd(&head, getNode(3));
    insertEnd(&head, getNode(4));
    insertEnd(&head, getNode(5));
 
    cout << "Current list:\n";
    display(head);
 
    head = reverse(head);
 
    cout << "\n\nReversed list:\n";
    display(head);
 
    return 0;
}

Java

// Java implementation to reverse a
// doubly circular linked list
class GFG
{
 
// structure of a node of linked list
static class Node
{
    int data;
    Node next, prev;
};
 
// function to create and return a new node
static Node getNode(int data)
{
    Node newNode = new Node();
    newNode.data = data;
    return newNode;
}
 
// Function to insert at the end
static Node insertEnd(Node head, Node new_node)
{
    // If the list is empty, create a single node
    // circular and doubly list
    if (head == null)
    {
        new_node.next = new_node.prev = new_node;
        head = new_node;
        return head;
    }
 
    // If list is not empty
 
    // Find last node /
    Node last = (head).prev;
 
    // Start is going to be next of new_node
    new_node.next = head;
 
    // Make new node previous of start
    (head).prev = new_node;
 
    // Make last previous of new node
    new_node.prev = last;
 
    // Make new node next of old last
    last.next = new_node;
    return head;
}
 
// Utility function to reverse a
// doubly circular linked list
static Node reverse(Node head)
{
    if (head==null)
        return null;
 
    // Initialize a new head pointer
    Node new_head = null;
 
    // get pointer to the last node
    Node last = head.prev;
 
    // set 'curr' to last node
    Node curr = last, prev;
 
    // traverse list in backward direction
    while (curr.prev != last)
    {
        prev = curr.prev;
 
        // insert 'curr' at the end of the list
        // starting with the 'new_head' pointer
        new_head=insertEnd(new_head, curr);
        curr = prev;
    }
    new_head=insertEnd(new_head, curr);
 
    // head pointer of the reversed list
    return new_head;
}
 
// function to display a doubly circular list in
// forward and backward direction
static void display(Node head)
{
    if (head==null)
        return;
 
    Node temp = head;
 
    System.out.print( "Forward direction: ");
    while (temp.next != head)
    {
        System.out.print( temp.data + " ");
        temp = temp.next;
    }
        System.out.print( temp.data + " ");
 
    Node last = head.prev;
    temp = last;
 
    System.out.print( "\nBackward direction: ");
    while (temp.prev != last)
    {
        System.out.print( temp.data + " ");
        temp = temp.prev;
    }
        System.out.print( temp.data + " ");
}
 
// Driver code
public static void main(String args[])
{
    Node head = null;
 
    head =insertEnd(head, getNode(1));
    head =insertEnd(head, getNode(2));
    head =insertEnd(head, getNode(3));
    head =insertEnd(head, getNode(4));
    head =insertEnd(head, getNode(5));
 
    System.out.print( "Current list:\n");
    display(head);
 
    head = reverse(head);
 
    System.out.print( "\n\nReversed list:\n");
    display(head);
}
}
 
// This code is contributed by Arnab Kundu

Python3

# Python3 implementation to reverse a
# doubly circular linked list
import math
 
# structure of a node of linked list
class Node:
    def __init__(self, data):
        self.data = data
        self.next = None
 
# function to create and return a new node
def getNode(data):
    newNode = Node(data)
    newNode.data = data
    return newNode
 
# Function to insert at the end
def insertEnd(head, new_node):
     
    # If the list is empty, create a single node
    # circular and doubly list
    if (head == None) :
        new_node.next = new_node
        new_node.prev = new_node
        head = new_node
        return head
     
    # If list is not empty
 
    # Find last node
    last = head.prev
 
    # Start is going to be next of new_node
    new_node.next = head
 
    # Make new node previous of start
    head.prev = new_node
 
    # Make last previous of new node
    new_node.prev = last
 
    # Make new node next of old last
    last.next = new_node
    return head
 
# Utility function to reverse a
# doubly circular linked list
def reverse(head):
    if (head == None):
        return None
 
    # Initialize a new head pointer
    new_head = None
 
    # get pointer to the last node
    last = head.prev
 
    # set 'curr' to last node
    curr = last
    #*prev
 
    # traverse list in backward direction
    while (curr.prev != last):
        prev = curr.prev
 
        # insert 'curr' at the end of the list
        # starting with the 'new_head' pointer
        new_head = insertEnd(new_head, curr)
        curr = prev
     
    new_head = insertEnd(new_head, curr)
 
    # head pointer of the reversed list
    return new_head
 
# function to display a doubly circular list in
# forward and backward direction
def display(head):
    if (head == None):
        return
     
    temp = head
 
    print("Forward direction: ", end = "")
    while (temp.next != head):
        print(temp.data, end = " ")
        temp = temp.next
     
    print(temp.data)
 
    last = head.prev
    temp = last
 
    print("Backward direction: ", end = "")
    while (temp.prev != last):
        print(temp.data, end = " ")
        temp = temp.prev
     
    print(temp.data)
 
# Driver Code
if __name__=='__main__':
 
    head = None
 
    head = insertEnd(head, getNode(1))
    head = insertEnd(head, getNode(2))
    head = insertEnd(head, getNode(3))
    head = insertEnd(head, getNode(4))
    head = insertEnd(head, getNode(5))
 
    print("Current list:")
    display(head)
 
    head = reverse(head)
 
    print("\nReversed list:")
    display(head)
 
# This code is contributed by Srathore

C#

// C# implementation to reverse a
// doubly circular linked list
using System;
 
class GFG
{
 
// structure of a node of linked list
public class Node
{
    public int data;
    public Node next, prev;
};
 
// function to create and return a new node
static Node getNode(int data)
{
    Node newNode = new Node();
    newNode.data = data;
    return newNode;
}
 
// Function to insert at the end
static Node insertEnd(Node head, Node new_node)
{
    // If the list is empty, create a single node
    // circular and doubly list
    if (head == null)
    {
        new_node.next = new_node.prev = new_node;
        head = new_node;
        return head;
    }
 
    // If list is not empty
 
    // Find last node /
    Node last = (head).prev;
 
    // Start is going to be next of new_node
    new_node.next = head;
 
    // Make new node previous of start
    (head).prev = new_node;
 
    // Make last previous of new node
    new_node.prev = last;
 
    // Make new node next of old last
    last.next = new_node;
    return head;
}
 
// Utility function to reverse a
// doubly circular linked list
static Node reverse(Node head)
{
    if (head == null)
        return null;
 
    // Initialize a new head pointer
    Node new_head = null;
 
    // get pointer to the last node
    Node last = head.prev;
 
    // set 'curr' to last node
    Node curr = last, prev;
 
    // traverse list in backward direction
    while (curr.prev != last)
    {
        prev = curr.prev;
 
        // insert 'curr' at the end of the list
        // starting with the 'new_head' pointer
        new_head=insertEnd(new_head, curr);
        curr = prev;
    }
    new_head=insertEnd(new_head, curr);
 
    // head pointer of the reversed list
    return new_head;
}
 
// function to display a doubly circular list in
// forward and backward direction
static void display(Node head)
{
    if (head == null)
        return;
 
    Node temp = head;
 
    Console.Write( "Forward direction: ");
    while (temp.next != head)
    {
        Console.Write( temp.data + " ");
        temp = temp.next;
    }
        Console.Write( temp.data + " ");
 
    Node last = head.prev;
    temp = last;
 
    Console.Write( "\nBackward direction: ");
    while (temp.prev != last)
    {
        Console.Write( temp.data + " ");
        temp = temp.prev;
    }
        Console.Write( temp.data + " ");
}
 
// Driver code
public static void Main(String []args)
{
    Node head = null;
 
    head = insertEnd(head, getNode(1));
    head = insertEnd(head, getNode(2));
    head = insertEnd(head, getNode(3));
    head = insertEnd(head, getNode(4));
    head = insertEnd(head, getNode(5));
 
    Console.Write( "Current list:\n");
    display(head);
 
    head = reverse(head);
 
    Console.Write( "\n\nReversed list:\n");
    display(head);
}
}
 
// This code contributed by Rajput-Ji

Javascript

<script>
 
      // JavaScript implementation to reverse a
      // doubly circular linked list
      // structure of a node of linked list
      class Node {
        constructor() {
          this.data = 0;
          this.next = null;
          this.prev = null;
        }
      }
 
      // function to create and return a new node
      function getNode(data) {
        var newNode = new Node();
        newNode.data = data;
        return newNode;
      }
 
      // Function to insert at the end
      function insertEnd(head, new_node) {
        // If the list is empty, create a single node
        // circular and doubly list
        if (head == null) {
          new_node.next = new_node.prev = new_node;
          head = new_node;
          return head;
        }
 
        // If list is not empty
 
        // Find last node /
        var last = head.prev;
 
        // Start is going to be next of new_node
        new_node.next = head;
 
        // Make new node previous of start
        head.prev = new_node;
 
        // Make last previous of new node
        new_node.prev = last;
 
        // Make new node next of old last
        last.next = new_node;
        return head;
      }
 
      // Utility function to reverse a
      // doubly circular linked list
      function reverse(head) {
        if (head == null) return null;
 
        // Initialize a new head pointer
        var new_head = null;
 
        // get pointer to the last node
        var last = head.prev;
 
        // set 'curr' to last node
        var curr = last,
          prev;
 
        // traverse list in backward direction
        while (curr.prev != last) {
          prev = curr.prev;
 
          // insert 'curr' at the end of the list
          // starting with the 'new_head' pointer
          new_head = insertEnd(new_head, curr);
          curr = prev;
        }
        new_head = insertEnd(new_head, curr);
 
        // head pointer of the reversed list
        return new_head;
      }
 
      // function to display a doubly circular list in
      // forward and backward direction
      function display(head) {
        if (head == null) return;
 
        var temp = head;
 
        document.write("Forward direction: ");
        while (temp.next != head) {
          document.write(temp.data + " ");
          temp = temp.next;
        }
        document.write(temp.data + " ");
 
        var last = head.prev;
        temp = last;
 
        document.write("<br>Backward direction: ");
        while (temp.prev != last) {
          document.write(temp.data + " ");
          temp = temp.prev;
        }
        document.write(temp.data + " ");
      }
 
      // Driver code
      var head = null;
 
      head = insertEnd(head, getNode(1));
      head = insertEnd(head, getNode(2));
      head = insertEnd(head, getNode(3));
      head = insertEnd(head, getNode(4));
      head = insertEnd(head, getNode(5));
 
      document.write("Current list:<br>");
      display(head);
 
      head = reverse(head);
 
      document.write("<br><br>Reversed list:<br>");
      display(head);
       
</script>

Producción:  

Current list:
Forward direction: 1 2 3 4 5
Backward direction: 5 4 3 2 1

Reversed list:
Forward direction: 5 4 3 2 1
Backward direction: 1 2 3 4 5

Complejidad de tiempo: O (n), ya que estamos usando un bucle para atravesar n veces. Donde n es el número de Nodes en la lista enlazada.

Espacio auxiliar: O(1), ya que no estamos utilizando ningún espacio adicional.

Publicación traducida automáticamente

Artículo escrito por ayushjauhari14 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *