loading...
Cover image for Data Structures & Algorithms in JavaScript(Circular linked list)

Data Structures & Algorithms in JavaScript(Circular linked list)

swarup260 profile image Swarup Das Updated on ・4 min read

Hello Everyone, this is part 7 in the series of blogs about data structures and algorithms in JavaScript, In this blog, I will cover Circular linked list.

What is the Circular linked list?

Circular linked list is a linked list where all nodes are connected to form a circle. There is no NULL at the end. A circular linked list can be a singly circular linked list or doubly circular linked list. - geeksforgeeks.org

Circular Single Linked List

Fig: Circular Single Linked List

Circular Doubly Linked List

Fig: Circular Doubly Linked List

List Of Operations Available

  • All methods will same as single linked list. Only overwrite the insert, push and removeAt methods

Implementation of Circular linked list in Javascript

The CircularLinkedList class does not need and additional properties, so we can simply extend the LinkedList Class, only overwrite the required methods.


class CircularLinkedList extends  LinkedList {
     constructor(){
         super();
     }
}

Push

Push method will append an element at the end of the LinkedList. While appending an element (node), There are two scenarios :

  1. LinkedList is Empty.

    • set the linked list head property to the new node.
    • set new node's next to the head, since circular LinkedList doesn't have a NULL pointer at the end.
  2. LinkedList is Not Empty.

    • loop till the end.
    • set the End node to the new node i.e end node.next to the node.
    • set new node's next to the head. after pushing an element to linked list increment the counter
   push(element){
         let node = new Node(element);
         let current = this.head;
         if (current == undefined) {
             this.head = node;
             node.next = this.head;
         } else {
             while(current.next != null){
                 current = current.next;
             }
             current.next = node;
             node.next = this.head;
         }
         this.count++;
         return this;
     }

Insert

Insert method will insert an element at a given position. The position must be greater than zero and less than or equal to count (length of LinkedList). If not return undefined.

  1. The index is Zero
    • Empty
    • Same as push method condition, when LinkedList is empty
    • Not Empty
    • set the new node to the current head
    • head to the new node
  2. The index is equal to count .ie length of LinkedList
    • Get the (index - 1) element using the getElementAt method, store as the previous Element.
    • Set previous to the new node. And node's next to the head.
  3. The index is greater than Zero
    • Get the (index - 1) element using the getElementAt method, store as the previous Element.
    • The indexed element will be previous. next, store as current.
    • Set previous to the new node. And node's next to previous.

after pushing an element to linked list increment the counter

Insert

        insert(element,index){
         if (index >= 0 && index <= this.count) {
             const node = new Node(element);
             let current = this.head
             if (index == 0) {
                 if (this.head == undefined) {
                     this.head = node;
                     node.next = this.head;
                }else{
                    node.next = current;
                    this.head = node;
                 }
             }else if (index == this.count) {
                 const previous = this.getElementAt(index -1);
                 previous.next = node;
                 node.next = this.head;
             }else{
                const previous = this.getElementAt(index -1);
                current = previous.next;
                previous.next = node;
                node.next = current;
             }
             this.count++;
             return this;
         }
         return undefined;
     }

RemoveAt

RemovAt method will remove an element at a given position. The position must valid the index's out of bound error, by checking that the position is greater than and equal to zero and less than count. If not return undefined.

  1. LinkedList is Empty
    • return undefined
  2. The index is Zero.
    • Move the head to the next node.
  3. The index is equal to the count - 1.
    • Get the (index - 1) element using the getElementAt method, store as the previous Element.
    • Set the previous's next to the head.

Removing the tail element

  1. The index is greater than Zero

    • Get the (index - 1) element using the getElementAt method, store as the previous Element.
    • The indexed element will be previous.next, store as current.
    • set the previous.next to the current.next.

    Removing any element

after removing an element from the linked list decrement the counter

        removeAt(index){
         if (index >= 0 && index < this.count) {
            if (this.isEmpty()) {
                return undefined;
            }
            let current = this.head
             if (index == 0) {
                 this.head = current.next;
             } else if(index == this.count-1) {
                const previous = this.getElementAt(index-1);
                 current = previous.next;
                 previous.next = this.head;
             }else{
                const previous = this.getElementAt(index -1);
                current = previous.next;
                previous.next = current.next;
             }

             this.count --;
             return current.element;
         }
         return undefined;
     }

Get the full source code here

Conclusion :

Complexity will be the same as Single Linked List. This blog only covers a singly circular linked list. But the doubly circular linked list will similar to the doubly linked list.

So, stay tuned for the next blog, in which I will cover another DS Sorted Linked List.

Posted on by:

Discussion

pic
Editor guide