Java - Circular Doubly Linked List
A circular doubly linked list is a linear data structure, in which the elements are stored in the form of a node. Each node contains three sub-elements. A data part that stores the value of the element, the previous part that stores the link to the previous node, and the next part that stores the link to the next node as shown in the below image:
The first node also known as HEAD is always used as a reference to traverse the list. Last element contains link to the first element as next and the first element contains link of the last element as previous. A circular doubly linked can be visualized as a chain of nodes, where every node points to previous and next node.
Implementation of Circular Doubly Linked List
Representation:
In Java, circular doubly linked list can be represented as a class and a Node as a separate class. The LinkedList class contains a reference of Node class type.
//node structure class Node { int data; Node next; Node prev; }; class LinkedList { Node head; //constructor to create an empty LinkedList LinkedList(){ head = null; } };
Create a Circular Doubly Linked List
Let us create a simple circular doubly linked list which contains three data nodes.
//node structure class Node { int data; Node next; Node prev; }; class LinkedList { Node head; //constructor to create an empty LinkedList LinkedList(){ head = null; } }; // test the code public class Implementation { public static void main(String[] args) { //create an empty LinkedList LinkedList MyList = new LinkedList(); //Add first node. Node first = new Node(); first.data = 10; first.next = null; first.prev = null; //linking with head node MyList.head = first; //linking next of the node with head first.next = MyList.head; //linking prev of the head MyList.head.prev = first; //Add second node. Node second = new Node(); second.data = 20; second.next = null; //linking with first node second.prev = first; first.next = second; //linking next of the node with head second.next = MyList.head; //linking prev of the head MyList.head.prev = second; //Add third node. Node third = new Node(); third.data = 30; third.next = null; //linking with second node third.prev = second; second.next = third; //linking next of the node with head third.next = MyList.head; //linking prev of the head MyList.head.prev = third; } }
Traverse a Circular Doubly Linked List
A circular doubly linked list can be traversed from any node of the list using a temp node. Keep on moving the temp node to the next one and displaying its content. Stop the traversal, after reaching the starting node.
//node structure class Node { int data; Node next; Node prev; }; class LinkedList { Node head; //constructor to create an empty LinkedList LinkedList(){ head = null; } //display the content of the list void PrintList() { Node temp = new Node(); temp = this.head; if(temp != null) { System.out.print("The list contains: "); while(true) { System.out.print(temp.data + " "); temp = temp.next; if(temp == this.head) break; } System.out.println(); } else { System.out.println("The list is empty."); } } }; // test the code public class Implementation { public static void main(String[] args) { //create an empty LinkedList LinkedList MyList = new LinkedList(); //Add first node. Node first = new Node(); first.data = 10; first.next = null; first.prev = null; //linking with head node MyList.head = first; //linking next of the node with head first.next = MyList.head; //linking prev of the head MyList.head.prev = first; //Add second node. Node second = new Node(); second.data = 20; second.next = null; //linking with first node second.prev = first; first.next = second; //linking next of the node with head second.next = MyList.head; //linking prev of the head MyList.head.prev = second; //Add third node. Node third = new Node(); third.data = 30; third.next = null; //linking with second node third.prev = second; second.next = third; //linking next of the node with head third.next = MyList.head; //linking prev of the head MyList.head.prev = third; //print the content of list MyList.PrintList(); } }
The above code will give the following output:
The list contains: 10 20 30