Lista enlazada doblemente circular | Serie 1 (Introducción e Inserción)

Requisito previo: lista doblemente enlazada, lista circular enlazada La lista 
circular doblemente enlazada tiene propiedades tanto de lista doblemente enlazada como de lista circular enlazada en las que dos elementos consecutivos están enlazados o conectados por el puntero anterior y siguiente y el último Node apunta al primer Node por el puntero siguiente y también el primer Node apunta al último Node por el puntero anterior.

A continuación se muestra la representación de un Node de lista circular doblemente enlazada en C/C++: 

// Structure of the node 
struct node
{
    int data;
    struct node *next; // Pointer to next node
    struct node *prev; // Pointer to previous node
};

Circular doubly linked list

Inserción en Lista Circular Doblemente Vinculada

Inserción en Lista Circular Doblemente Vinculada

  • Inserción al final de la lista o en una lista vacía
    • Lista vacía (inicio = NULL): se inserta un Node (Diga N) con datos = 5, por lo que el puntero anterior de N apunta a N y el siguiente puntero de N también apunta a N. Pero ahora el puntero de inicio apunta al primer Node de la lista .

Insertion in empty list1

  • La lista contiene inicialmente algunos Nodes, el inicio apunta al primer Node de la lista: se inserta un Node (digamos M) con datos = 7, por lo que el puntero anterior de M apunta al último Node, el siguiente puntero de M apunta al primer Node y el último Node al siguiente puntero apunta a este Node M y el puntero anterior del primer Node apunta a este Node M.

Insertion in a list

Implementación:

C++

// Function to insert at the end
void insertEnd(struct Node** start, int value)
{
    // If the list is empty, create a single node
    // circular and doubly list
    if (*start == NULL)
    {
        struct Node* new_node = new Node;
        new_node->data = value;
        new_node->next = new_node->prev = new_node;
        *start = new_node;
        return;
    }
 
    // If list is not empty
 
    /* Find last node */
    Node *last = (*start)->prev;
 
    // Create Node dynamically
    struct Node* new_node = new Node;
    new_node->data = value;
 
    // Start is going to be next of new_node
    new_node->next = *start;
 
    // Make new node previous of start
    (*start)->prev = new_node;
 
    // Make last previous of new node
    new_node->prev = last;
 
    // Make new node next of old last
    last->next = new_node;
}

Java

// Function to insert at the end
static void insertEnd(int value)
{
     
    // If the list is empty, create a single
      // node circular and doubly list
    if (start == null)
    {
        Node new_node = new Node();
        new_node.data = value;
        new_node.next = new_node.prev = new_node;
        start = new_node;
        return;
    }
  
    // If list is not empty
  
    // Find last node
    Node last = (start).prev;
  
    // Create Node dynamically
    Node new_node = new Node();
    new_node.data = value;
  
    // Start is going to be
      // next of new_node
    new_node.next = start;
  
    // Make new node previous of start
    (start).prev = new_node;
  
    // Make last previous of new node
    new_node.prev = last;
  
    // Make new node next of old last
    last.next = new_node;
}
 
// This code is contributed by rutvik_56

Python3

# Function to insert at the end
def insertEnd(value) :
global start
 
# If the list is empty, create a
# single node circular and doubly list
if (start == None) :
 
    new_node = Node(0)
    new_node.data = value
    new_node.next = new_node.prev = new_node
    start = new_node
    return
 
# If list is not empty
 
# Find last node */
last = (start).prev
 
# Create Node dynamically
new_node = Node(0)
new_node.data = value
 
# Start is going to be next of new_node
new_node.next = start
 
# Make new node previous of start
(start).prev = new_node
 
# Make last previous of new node
new_node.prev = last
 
# Make new node next of old last
last.next = new_node
 
# This code is contributed by shivanisinghss2110

C#

// Function to insert at the end
static void insertEnd(int value)
{
    Node new_node;
      
    // If the list is empty, create a single node
    // circular and doubly list
    if (start == null)
    {
        new_node = new Node();
        new_node.data = value;
        new_node.next = new_node.prev = new_node;
        start = new_node;
        return;
    }
  
    // If list is not empty
  
    /* Find last node */
    Node last = (start).prev;
  
    // Create Node dynamically
    new_node = new Node();
    new_node.data = value;
  
    // Start is going to be next of new_node
    new_node.next = start;
  
    // Make new node previous of start
    (start).prev = new_node;
  
    // Make last previous of new node
    new_node.prev = last;
  
    // Make new node next of old last
    last.next = new_node;
}
 
// This code is contributed by Pratham76

Javascript

<script>
// Function to insert at the end
function insertEnd(value)
{
     
    // If the list is empty, create a single
      // node circular and doubly list
    if (start == null)
    {
        var new_node = new Node();
        new_node.data = value;
        new_node.next = new_node.prev = new_node;
        start = new_node;
        return;
    }
  
    // If list is not empty
  
    // Find last node
    var last = (start).prev;
  
    // Create Node dynamically
    var new_node = new Node();
    new_node.data = value;
  
    // Start is going to be
      // next of new_node
    new_node.next = start;
  
    // Make new node previous of start
    (start).prev = new_node;
  
    // Make last previous of new node
    new_node.prev = last;
  
    // Make new node next of old last
    last.next = new_node;
}
 
 
// This code contributed by aashish1995
</script>
  • Inserción al comienzo de la lista: para insertar un Node al comienzo de la lista, cree un Node (Digamos T) con datos = 5, el puntero siguiente T apunta al primer Node de la lista, el puntero anterior T apunta al último Node el list, el puntero siguiente del último Node apunta a este Node T, el puntero anterior del primer Node también apunta a este Node T y, por último, no olvide cambiar el puntero ‘Inicio’ a este Node T.

Insertion at beginning of list

Implementación:

C++

// Function to insert Node at the beginning
// of the List,
void insertBegin(struct Node** start, int value)
{
    // Pointer points to last Node
    struct Node *last = (*start)->prev;
 
    struct Node* new_node = new Node;
    new_node->data = value;   // Inserting the data
 
    // setting up previous and next of new node
    new_node->next = *start;
    new_node->prev = last;
 
    // Update next and previous pointers of start
    // and last.
    last->next = (*start)->prev = new_node;
 
    // Update start pointer
    *start = new_node;
}

Java

// Function to insert Node at the beginning
// of the List,
static void insertBegin(int value)
{
    // Pointer points to last Node
    Node last = (start).prev;
 
    Node new_node = new Node();
    new_node.data = value; // Inserting the data
 
    // setting up previous and next of new node
    new_node.next = start;
    new_node.prev = last;
 
    // Update next and previous pointers of start
    // and last.
    last.next = (start).prev = new_node;
 
    // Update start pointer
    start = new_node;
}
 
// this code is contributed by shivanisinghss2110

Python3

# Function to insert Node at the beginning
# of the List,
def insertBegin( value) :
    global start
     
    # Pointer points to last Node
    last = (start).prev
 
    new_node = Node(0)
    new_node.data = value # Inserting the data
 
    # setting up previous and
    # next of new node
    new_node.next = start
    new_node.prev = last
 
    # Update next and previous pointers
    # of start and last.
    last.next = (start).prev = new_node
     
    # Update start pointer
    start = new_node
     
    # This code is contributed by shivanisinghss2110

C#

// Function to insert Node at the beginning
// of the List,
static void insertBegin(int value)
{
   
    // Pointer points to last Node
    Node last = (start).prev;
 
    Node new_node = new Node();
    new_node.data = value; // Inserting the data
 
    // setting up previous and next of new node
    new_node.next = start;
    new_node.prev = last;
 
    // Update next and previous pointers of start
    // and last.
    last.next = (start).prev = new_node;
 
    // Update start pointer
    start = new_node;
}
 
// This code is contributed by shivanisinghss2110

Javascript

// Function to insert Node at the beginning
      // of the List,
      function insertBegin(value) {
        // Pointer points to last Node
        var last = start.prev;
 
        var new_node = new Node();
        new_node.data = value; // Inserting the data
 
        // setting up previous and next of new node
        new_node.next = start;
        new_node.prev = last;
 
        // Update next and previous pointers of start
        // and last.
        last.next = start.prev = new_node;
 
        // Update start pointer
        start = new_node;
      }
       
      // This code is contributed by shivanisinghss2110
  • Inserción entre los Nodes de la lista : Para insertar un Node entre la lista, se requieren dos valores de datos, uno después del cual se insertará el nuevo Node y otro son los datos del nuevo Node.

Insertion in between the list

Implementación:

C++

// Function to insert node with value as value1.
// The new node is inserted after the node with
// with value2
void insertAfter(struct Node** start, int value1,
                                      int value2)
{
    struct Node* new_node = new Node;
    new_node->data = value1; // Inserting the data
 
    // Find node having value2 and next node of it
    struct Node *temp = *start;
    while (temp->data != value2)
        temp = temp->next;
    struct Node *next = temp->next;
 
    // insert new_node between temp and next.
    temp->next = new_node;
    new_node->prev = temp;
    new_node->next = next;
    next->prev = new_node;
}

Java

// Function to insert node with value as value1.
// The new node is inserted after the node with
// with value2
static void insertAfter(int value1,
                                    int value2)
{
    Node new_node = new Node();
    new_node.data = value1; // Inserting the data
 
    // Find node having value2 and next node of it
    Node temp = start;
    while (temp.data != value2)
        temp = temp.next;
    Node next = temp.next;
 
    // insert new_node between temp and next.
    temp.next = new_node;
    new_node.prev = temp;
    new_node.next = next;
    next.prev = new_node;
}
 
// this code is contributed by shivanisinghss2110

Python3

# Function to insert node with value as value1.
# The new node is inserted after the node with
# with value2
def insertAfter(value1, value2) :
    global start
    new_node = Node(0)
    new_node.data = value1 # Inserting the data
 
    # Find node having value2 and
    # next node of it
    temp = start
    while (temp.data != value2) :
        temp = temp.next
    next = temp.next
 
    # insert new_node between temp and next.
    temp.next = new_node
    new_node.prev = temp
    new_node.next = next
    next.prev = new_node
     
# this code is contributed by shivanisinghss2110

C#

// Function to insert node with value as value1.
// The new node is inserted after the node with
// with value2
static void insertAfter(int value1, int value2)
{
    Node new_node = new Node();
    new_node.data = value1; // Inserting the data
 
    // Find node having value2 and next node of it
    Node temp = start;
    while (temp.data != value2)
        temp = temp.next;
    Node next = temp.next;
 
    // insert new_node between temp and next.
    temp.next = new_node;
    new_node.prev = temp;
    new_node.next = next;
    next.prev = new_node;
}
 
// this code is contributed by shivanisinghss2110

Javascript

<script>
 
// Function to insert node with value as value1.
// The new node is inserted after the node with
// with value2
function insertAfter(value1, value2)
{
    var new_node = new Node();
     
    // Inserting the data
    new_node.data = value1;
 
    // Find node having value2 and
    // next node of it
    var temp = start;
    while (temp.data != value2)
        temp = temp.next;
         
    var next = temp.next;
 
    // Insert new_node between temp and next.
    temp.next = new_node;
    new_node.prev = temp;
    new_node.next = next;
    next.prev = new_node;
}
       
// This code is contributed by shivanisinghss2110
 
</script>

El siguiente es un programa completo que utiliza todos los métodos anteriores para crear una lista circular doblemente enlazada.  

C++

// C++ program to illustrate inserting a Node in
// a Circular Doubly Linked list in begging, end
// and middle
#include <bits/stdc++.h>
using namespace std;
 
// Structure of a Node
struct Node
{
    int data;
    struct Node *next;
    struct Node *prev;
};
 
// Function to insert at the end
void insertEnd(struct Node** start, int value)
{
    // If the list is empty, create a single node
    // circular and doubly list
    if (*start == NULL)
    {
        struct Node* new_node = new Node;
        new_node->data = value;
        new_node->next = new_node->prev = new_node;
        *start = new_node;
        return;
    }
 
    // If list is not empty
 
    /* Find last node */
    Node *last = (*start)->prev;
 
    // Create Node dynamically
    struct Node* new_node = new Node;
    new_node->data = value;
 
    // Start is going to be next of new_node
    new_node->next = *start;
 
    // Make new node previous of start
    (*start)->prev = new_node;
 
    // Make last previous of new node
    new_node->prev = last;
 
    // Make new node next of old last
    last->next = new_node;
}
 
// Function to insert Node at the beginning
// of the List,
void insertBegin(struct Node** start, int value)
{
    // Pointer points to last Node
    struct Node *last = (*start)->prev;
 
    struct Node* new_node = new Node;
    new_node->data = value;   // Inserting the data
 
    // setting up previous and next of new node
    new_node->next = *start;
    new_node->prev = last;
 
    // Update next and previous pointers of start
    // and last.
    last->next = (*start)->prev = new_node;
 
    // Update start pointer
    *start = new_node;
}
 
// Function to insert node with value as value1.
// The new node is inserted after the node with
// with value2
void insertAfter(struct Node** start, int value1,
                                      int value2)
{
    struct Node* new_node = new Node;
    new_node->data = value1; // Inserting the data
 
    // Find node having value2 and next node of it
    struct Node *temp = *start;
    while (temp->data != value2)
        temp = temp->next;
    struct Node *next = temp->next;
 
    // insert new_node between temp and next.
    temp->next = new_node;
    new_node->prev = temp;
    new_node->next = next;
    next->prev = new_node;
}
 
 
void display(struct Node* start)
{
    struct Node *temp = start;
 
    printf("\nTraversal in forward direction \n");
    while (temp->next != start)
    {
        printf("%d ", temp->data);
        temp = temp->next;
    }
    printf("%d ", temp->data);
 
    printf("\nTraversal in reverse direction \n");
    Node *last = start->prev;
    temp = last;
    while (temp->prev != last)
    {
        printf("%d ", temp->data);
        temp = temp->prev;
    }
    printf("%d ", temp->data);
}
 
/* Driver program to test above functions*/
int main()
{
    /* Start with the empty list */
    struct Node* start = NULL;
 
    // Insert 5. So linked list becomes 5->NULL
    insertEnd(&start, 5);
 
    // Insert 4 at the beginning. So linked
    // list becomes 4->5
    insertBegin(&start, 4);
 
    // Insert 7 at the end. So linked list
    // becomes 4->5->7
    insertEnd(&start, 7);
 
    // Insert 8 at the end. So linked list
    // becomes 4->5->7->8
    insertEnd(&start, 8);
 
    // Insert 6, after 5. So linked list
    // becomes 4->5->6->7->8
    insertAfter(&start, 6, 5);
 
    printf("Created circular doubly linked list is: ");
    display(start);
 
    return 0;
}

Java

// Java program to illustrate inserting a Node in
// a Circular Doubly Linked list in begging, end
// and middle
import java.util.*;
 
class GFG
{
 
static Node start;
 
// Structure of a Node
static class Node
{
    int data;
    Node next;
    Node prev;
};
 
// Function to insert at the end
static void insertEnd(int value)
{
    // If the list is empty, create a single node
    // circular and doubly list
    if (start == null)
    {
        Node new_node = new Node();
        new_node.data = value;
        new_node.next = new_node.prev = new_node;
        start = new_node;
        return;
    }
 
    // If list is not empty
 
    /* Find last node */
    Node last = (start).prev;
 
    // Create Node dynamically
    Node new_node = new Node();
    new_node.data = value;
 
    // Start is going to be next of new_node
    new_node.next = start;
 
    // Make new node previous of start
    (start).prev = new_node;
 
    // Make last previous of new node
    new_node.prev = last;
 
    // Make new node next of old last
    last.next = new_node;
}
 
// Function to insert Node at the beginning
// of the List,
static void insertBegin(int value)
{
    // Pointer points to last Node
    Node last = (start).prev;
 
    Node new_node = new Node();
    new_node.data = value; // Inserting the data
 
    // setting up previous and next of new node
    new_node.next = start;
    new_node.prev = last;
 
    // Update next and previous pointers of start
    // and last.
    last.next = (start).prev = new_node;
 
    // Update start pointer
    start = new_node;
}
 
// Function to insert node with value as value1.
// The new node is inserted after the node with
// with value2
static void insertAfter(int value1,
                                    int value2)
{
    Node new_node = new Node();
    new_node.data = value1; // Inserting the data
 
    // Find node having value2 and next node of it
    Node temp = start;
    while (temp.data != value2)
        temp = temp.next;
    Node next = temp.next;
 
    // insert new_node between temp and next.
    temp.next = new_node;
    new_node.prev = temp;
    new_node.next = next;
    next.prev = new_node;
}
 
static void display()
{
    Node temp = start;
 
    System.out.printf("\nTraversal in forward direction \n");
    while (temp.next != start)
    {
        System.out.printf("%d ", temp.data);
        temp = temp.next;
    }
    System.out.printf("%d ", temp.data);
 
    System.out.printf("\nTraversal in reverse direction \n");
    Node last = start.prev;
    temp = last;
    while (temp.prev != last)
    {
        System.out.printf("%d ", temp.data);
        temp = temp.prev;
    }
    System.out.printf("%d ", temp.data);
}
 
/* Driver code*/
public static void main(String[] args)
{
    /* Start with the empty list */
    Node start = null;
 
    // Insert 5. So linked list becomes 5.null
    insertEnd(5);
 
    // Insert 4 at the beginning. So linked
    // list becomes 4.5
    insertBegin(4);
 
    // Insert 7 at the end. So linked list
    // becomes 4.5.7
    insertEnd(7);
 
    // Insert 8 at the end. So linked list
    // becomes 4.5.7.8
    insertEnd(8);
 
    // Insert 6, after 5. So linked list
    // becomes 4.5.6.7.8
    insertAfter(6, 5);
 
    System.out.printf("Created circular doubly linked list is: ");
    display();
}
}
 
// This code is contributed by Rajput-Ji

Python3

# Python3 program to illustrate inserting
# a Node in a Circular Doubly Linked list
# in begging, end and middle
start = None
 
# Structure of a Node
class Node:
    def __init__(self, data):
        self.data = data
        self.next = None
        self.prev = None
 
# Function to insert at the end
def insertEnd(value) :
    global start
     
    # If the list is empty, create a
    # single node circular and doubly list
    if (start == None) :
 
        new_node = Node(0)
        new_node.data = value
        new_node.next = new_node.prev = new_node
        start = new_node
        return
 
    # If list is not empty
 
    # Find last node */
    last = (start).prev
 
    # Create Node dynamically
    new_node = Node(0)
    new_node.data = value
 
    # Start is going to be next of new_node
    new_node.next = start
 
    # Make new node previous of start
    (start).prev = new_node
 
    # Make last previous of new node
    new_node.prev = last
 
    # Make new node next of old last
    last.next = new_node
 
# Function to insert Node at the beginning
# of the List,
def insertBegin( value) :
    global start
     
    # Pointer points to last Node
    last = (start).prev
 
    new_node = Node(0)
    new_node.data = value # Inserting the data
 
    # setting up previous and
    # next of new node
    new_node.next = start
    new_node.prev = last
 
    # Update next and previous pointers
    # of start and last.
    last.next = (start).prev = new_node
 
    # Update start pointer
    start = new_node
 
# Function to insert node with value as value1.
# The new node is inserted after the node with
# with value2
def insertAfter(value1, value2) :
    global start
    new_node = Node(0)
    new_node.data = value1 # Inserting the data
 
    # Find node having value2 and
    # next node of it
    temp = start
    while (temp.data != value2) :
        temp = temp.next
    next = temp.next
 
    # insert new_node between temp and next.
    temp.next = new_node
    new_node.prev = temp
    new_node.next = next
    next.prev = new_node
 
def display() :
    global start
    temp = start
 
    print ("Traversal in forward direction:")
    while (temp.next != start) :
 
        print (temp.data, end = " ")
        temp = temp.next
     
    print (temp.data)
     
    print ("Traversal in reverse direction:")
    last = start.prev
    temp = last
    while (temp.prev != last) :
 
        print (temp.data, end = " ")
        temp = temp.prev
     
    print (temp.data)
 
# Driver Code
if __name__ == '__main__':
    global start
     
    # Start with the empty list
    start = None
     
    # Insert 5. So linked list becomes 5.None
    insertEnd(5)
 
    # Insert 4 at the beginning. So linked
    # list becomes 4.5
    insertBegin(4)
 
    # Insert 7 at the end. So linked list
    # becomes 4.5.7
    insertEnd(7)
 
    # Insert 8 at the end. So linked list
    # becomes 4.5.7.8
    insertEnd(8)
 
    # Insert 6, after 5. So linked list
    # becomes 4.5.6.7.8
    insertAfter(6, 5)
 
    print ("Created circular doubly linked list is: ")
    display()
 
# This code is contributed by Arnab kundu

C#

// C# program to illustrate inserting a Node in
// a Circular Doubly Linked list in begging, end
// and middle
using System;
using System.Collections.Generic;
 
class GFG
{
static Node start;
 
// Structure of a Node
public class Node
{
    public int data;
    public Node next;
    public Node prev;
};
 
// Function to insert at the end
static void insertEnd(int value)
{
    Node new_node;
     
    // If the list is empty, create a single node
    // circular and doubly list
    if (start == null)
    {
        new_node = new Node();
        new_node.data = value;
        new_node.next = new_node.prev = new_node;
        start = new_node;
        return;
    }
 
    // If list is not empty
 
    /* Find last node */
    Node last = (start).prev;
 
    // Create Node dynamically
    new_node = new Node();
    new_node.data = value;
 
    // Start is going to be next of new_node
    new_node.next = start;
 
    // Make new node previous of start
    (start).prev = new_node;
 
    // Make last previous of new node
    new_node.prev = last;
 
    // Make new node next of old last
    last.next = new_node;
}
 
// Function to insert Node at the beginning
// of the List,
static void insertBegin(int value)
{
    // Pointer points to last Node
    Node last = (start).prev;
 
    Node new_node = new Node();
    new_node.data = value; // Inserting the data
 
    // setting up previous and next of new node
    new_node.next = start;
    new_node.prev = last;
 
    // Update next and previous pointers of start
    // and last.
    last.next = (start).prev = new_node;
 
    // Update start pointer
    start = new_node;
}
 
// Function to insert node with value as value1.
// The new node is inserted after the node with
// with value2
static void insertAfter(int value1, int value2)
{
    Node new_node = new Node();
    new_node.data = value1; // Inserting the data
 
    // Find node having value2 and next node of it
    Node temp = start;
    while (temp.data != value2)
        temp = temp.next;
    Node next = temp.next;
 
    // insert new_node between temp and next.
    temp.next = new_node;
    new_node.prev = temp;
    new_node.next = next;
    next.prev = new_node;
}
 
static void display()
{
    Node temp = start;
 
    Console.Write("\nTraversal in forward direction \n");
    while (temp.next != start)
    {
        Console.Write("{0} ", temp.data);
        temp = temp.next;
    }
    Console.Write("{0} ", temp.data);
 
    Console.Write("\nTraversal in reverse direction \n");
    Node last = start.prev;
    temp = last;
    while (temp.prev != last)
    {
        Console.Write("{0} ", temp.data);
        temp = temp.prev;
    }
    Console.Write("{0} ", temp.data);
}
 
/* Driver code*/
public static void Main(String[] args)
{
    /* Start with the empty list */
    Node start = null;
 
    // Insert 5. So linked list becomes 5.null
    insertEnd(5);
 
    // Insert 4 at the beginning. So linked
    // list becomes 4.5
    insertBegin(4);
 
    // Insert 7 at the end. So linked list
    // becomes 4.5.7
    insertEnd(7);
 
    // Insert 8 at the end. So linked list
    // becomes 4.5.7.8
    insertEnd(8);
 
    // Insert 6, after 5. So linked list
    // becomes 4.5.6.7.8
    insertAfter(6, 5);
 
    Console.Write("Created circular doubly linked list is: ");
    display();
}
}
 
// This code is contributed by Rajput-Ji

Javascript

<script>
 
      // JavaScript program to illustrate inserting a Node in
      // a Circular Doubly Linked list in begging, end
      // and middle
      var start = null;
 
      // Structure of a Node
      class Node {
        constructor() {
          this.data = 0;
          this.next = null;
          this.prev = null;
        }
      }
 
      // Function to insert at the end
      function insertEnd(value) {
        var new_node;
 
        // If the list is empty, create a single node
        // circular and doubly list
        if (start == null) {
          new_node = new Node();
          new_node.data = value;
          new_node.next = new_node.prev = new_node;
          start = new_node;
          return;
        }
 
        // If list is not empty
 
        /* Find last node */
        var last = start.prev;
 
        // Create Node dynamically
        new_node = new Node();
        new_node.data = value;
 
        // Start is going to be next of new_node
        new_node.next = start;
 
        // Make new node previous of start
        start.prev = new_node;
 
        // Make last previous of new node
        new_node.prev = last;
 
        // Make new node next of old last
        last.next = new_node;
      }
 
      // Function to insert Node at the beginning
      // of the List,
      function insertBegin(value) {
        // Pointer points to last Node
        var last = start.prev;
 
        var new_node = new Node();
        new_node.data = value; // Inserting the data
 
        // setting up previous and next of new node
        new_node.next = start;
        new_node.prev = last;
 
        // Update next and previous pointers of start
        // and last.
        last.next = start.prev = new_node;
 
        // Update start pointer
        start = new_node;
      }
 
      // Function to insert node with value as value1.
      // The new node is inserted after the node with
      // with value2
      function insertAfter(value1, value2) {
        var new_node = new Node();
        new_node.data = value1; // Inserting the data
 
        // Find node having value2 and next node of it
        var temp = start;
        while (temp.data != value2) temp = temp.next;
        var next = temp.next;
 
        // insert new_node between temp and next.
        temp.next = new_node;
        new_node.prev = temp;
        new_node.next = next;
        next.prev = new_node;
      }
 
      function display() {
        var temp = start;
 
        document.write("<br>Traversal in forward direction <br>");
        while (temp.next != start) {
          document.write(temp.data + " ");
          temp = temp.next;
        }
        document.write(temp.data);
 
        document.write("<br>Traversal in reverse direction <br>");
        var last = start.prev;
        temp = last;
        while (temp.prev != last) {
          document.write(temp.data + " ");
          temp = temp.prev;
        }
        document.write(temp.data);
      }
 
      /* Driver code*/
      /* Start with the empty list */
      var start = null;
 
      // Insert 5. So linked list becomes 5.null
      insertEnd(5);
 
      // Insert 4 at the beginning. So linked
      // list becomes 4.5
      insertBegin(4);
 
      // Insert 7 at the end. So linked list
      // becomes 4.5.7
      insertEnd(7);
 
      // Insert 8 at the end. So linked list
      // becomes 4.5.7.8
      insertEnd(8);
 
      // Insert 6, after 5. So linked list
      // becomes 4.5.6.7.8
      insertAfter(6, 5);
 
      document.write("Created circular doubly linked list is: ");
      display();
       
</script>
Producción

Created circular doubly linked list is: 
Traversal in forward direction 
4 5 6 7 8 
Traversal in reverse direction 
8 7 6 5 4 

Complejidad de tiempo: O(N)

El peor de los casos ocurre cuando tenemos que recorrer toda la lista.

Espacio Auxiliar: O(1)

Como espacio adicional constante se utiliza.

Las siguientes son las ventajas y desventajas de una lista circular doblemente enlazada: 

ventajas: 

  • La lista se puede recorrer desde ambas direcciones, es decir, de la cabeza a la cola o de la cola a la cabeza.
  • Saltar de la cabeza a la cola o de la cola a la cabeza se realiza en tiempo constante O(1).
  • Las listas circulares doblemente enlazadas se utilizan para la implementación de estructuras de datos avanzadas como Fibonacci Heap .

Desventajas 

  • Se necesita un poco más de memoria en cada Node para acomodar el puntero anterior.
  • Muchos punteros involucrados al implementar o realizar operaciones en una lista. Por lo tanto, los punteros deben manejarse con cuidado, de lo contrario, los datos de la lista pueden perderse.

Aplicaciones de la lista circular doblemente enlazada 

  • Gestión de listas de reproducción de canciones en aplicaciones de reproductores multimedia.
  • Gestión del carrito de la compra en compras online.

Este artículo es una contribución de Akash Gupta . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 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 *